P2986 [USACO10MAR]Great Cow Gathering G(换根dp)

题目传送门

本题是这题的延伸。

题意: 有一颗树,你可以选定一个根节点,这个根节点的代价是 ∑ c [ i ] ∗ d i s [ i ] \sum c[i]*dis[i] c[i]dis[i] c [ i ] c[i] c[i]表示点i的点权值, d i s [ i ] dis[i] dis[i]表示点i到根节点的距离。

思路: 先处理出以1为根节点的时候的代价,然后再遍历这棵树,根据方程转移即可。

  • f [ t o ] = f [ x ] − s i z [ i ] ∗ d i s ( x , t o ) + ( t o t c [ i ] − s i z [ i ] ) ∗ d i s ( x , t o ) f[to]=f[x]-siz[i]*dis(x,to)+(tot_{c[i]}-siz[i])*dis(x,to) f[to]=f[x]siz[i]dis(x,to)+(totc[i]siz[i])dis(x,to)

s i z [ i ] siz[i] siz[i]表示子树i中c[i]的和。

代码:

#include<bits/stdc++.h>
#define endl '\n'
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define pii pair<int,int>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
    int x=0,f=1;
    char ch=gc();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=gc();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=gc();
    }
    return x*f;
}
using namespace std;
const int N=1e6+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
const double eps=1e-7;

vector<pii>e[N];
int siz[N],f[N],n,c[N],m=0;
void dfs1(int fa,int x,int dis)
{
    siz[x] = c[x];
    for(auto i:e[x])
    {
        if(i.first==fa)
            continue;
        dfs1(x,i.first,dis+i.second);
        siz[x]+=siz[i.first];
    }
    f[1] = f[1] + c[x]*dis;
}
void dfs2(int fa,int x)
{
    for(auto i:e[x])
    {
        if(i.first==fa)
            continue;
        int to = i.first;
        f[to] = f[x]-siz[to]*i.second+(m-siz[to])*i.second;
        dfs2(x,to);
    }
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>c[i],m+=c[i];
    for(int i=1;i<n;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        e[u].pb(mp(v,w));
        e[v].pb(mp(u,w));
    }
    dfs1(1,1,0);
    dfs2(1,1);
    cout<<*min_element(f+1,f+n+1)<<endl;
}

signed main()
{
    solve();

    return 0;
}

### 使用 Docker 在本地环境中部署 Dify 为了在本地环境中使用 Docker 部署 Dify,可以遵循以下指南: #### 准备工作 确保已经安装了 Docker 和 Docker Compose。可以通过运行 `docker --version` 和 `docker-compose --version` 来验证是否已成功安装。 #### 下载项目文件 获取官方提供的 Dify 项目的 GitHub 地址或其他分发渠道链接[^3]。克隆仓库到本地计算机: ```bash git clone https://github.com/dify-ai/dify.git cd dify ``` #### 修改配置文件 进入项目目录后,找到并编辑必要的环境变量文件 `.env.example` 或者创建一个新的 `.env` 文件来设置特定参数,比如端口号、数据库连接字符串等。如果有镜像加速需求,则可以在 `/etc/docker/daemon.json` 中加入国内可用的镜像源列表以提高拉取速度[^2]: ```json { "registry-mirrors": [ "https://docker.211678.top", "https://docker.1panel.live" ] } ``` 记得保存更改后的 JSON 文件,并重启 Docker 服务使新配置生效。 #### 启动容器 利用 Docker Compose 工具启动所有关联的服务实例。假设存在名为 `docker-compose.yml` 的组合定义文档,在终端输入如下指令即可一键完成部署操作: ```bash sudo docker compose up -d ``` 此命令将以守护进程模式后台运行所有的服务组件。如果遇到任何错误提示,请参照相关日志信息排查问题所在[^1]。 #### 访问应用程序 当一切顺利时,应该能够通过浏览器或者其他 HTTP 客户端访问默认监听地址(通常是 http://localhost:port),具体端口取决于实际使用的配置项设定。对于更复杂的网络场景下可能还需要额外配置防火墙规则或是借助 cpolar 实现内网穿透功能以便于外部设备也能正常访问该 Web 应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值