Holiday's Accommodatio UVA

来源:互联网 发布:单片机自动门源程序 编辑:程序博客网 时间:2024/06/08 10:47

针对每一条边,假设这条边的父节点为v,字节点为u,假设以u为节点的子树的节点个数为k,由于总的节点个数为N,那么剩余的节点的个数也就是N-k,那么对于这一条边而言,要么是k个节点都出去,要么是N-k个节点都进来,为了满足题意需要取二者的最下值,也就是经过这条边的次数,乘以权值,对其他的边也同样处理即可,最后将结果都加起来,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;class Node{public:int ind, weight;};vector<Node> G[100010];long long res;int amount[100010];class Solve{public:int N;void Init(){memset(amount,0,sizeof(amount));cin >> N;res = 0;for (int i = 1; i <= N; i++)G[i].clear();for (int i = 1; i < N; i++){int a, b, c;cin >> a >> b >> c;Node temp;temp.ind = b, temp.weight = c;G[a].push_back(temp);temp.ind = a;G[b].push_back(temp);}}void dfs(int cur,int fa,int w){if (G[cur].size() == 1 && G[cur][0].ind == fa){amount[cur] = 1;res += w;return;}amount[cur] = 1;for (int i = 0; i < G[cur].size(); i++){if (G[cur][i].ind != fa){dfs(G[cur][i].ind, cur, G[cur][i].weight);amount[cur] += amount[G[cur][i].ind];}}res += (long long)min(amount[cur], N - amount[cur])*(long long)w;}long long Deal(){Init();dfs(1,0,0);return res;}};int main(){int T;cin >> T;Solve a;for (int i = 1; i <= T; i++){cout << "Case #" << i << ": "<<(a.Deal()<<1)<<endl;}return 0;}


原创粉丝点击