hdu6060 RXD and dividing

来源:互联网 发布:辉素网络带练真的假的 编辑:程序博客网 时间:2024/06/02 00:31

题意:将节点2到n分成k部分,然后对于每一部分都加上1号节点。在原图中选取一些边,让这一部分内部联通。问怎么分能使花费最大。
分析:如果一个点的子节点被分成各个部分,那么从它走到1号节点的部分就会走k遍,所以尽量让一个节点的子节点分成更多的部分。

#include<cstdio>#include<queue>#include<cstring>#include<algorithm>#include<vector>using namespace std;typedef long long ll;const int N = 1e6 + 10;vector<int> a[N];vector<ll> p[N];ll num[N], ans;ll n, m, s;void dfs(int k, ll d){    for(int i = 0; i < a[k].size(); i++){        dfs(a[k][i], p[k][i]);        num[k] += num[a[k][i]];    }    num[k] += 1;    ans += min(num[k], s) * d;}int main(){    while(~scanf("%lld%lld", &n, &s)){        ans = 0;        memset(num, 0, sizeof(num));        for(int i = 0; i < N; i++){            a[i].clear();            p[i].clear();        }        for(int i = 1; i < n; i++){            ll x, y, w;            scanf("%lld%lld%lld", &x, &y, &w);            a[x].push_back(y);            p[x].push_back(w);        }        dfs(1, 0);        printf("%lld\n", ans);    }}