Conquer a New Region HDU - 4424
2017-10-06 16:34
393 查看
点击打开链接
想了很久也没啥思路.. 看了博客才知道 原来并查集还能这么玩
根据题意 两点之间的运输能力取决于最小边
先把所有边降序排序 然后按照生成树的套路一条一条加 这样就满足了一定的单调性
同时并查集要增加两个维护对象 一个是本集合中所有点的数目 一个是本集合中所有点到boss节点的运输能力之和
这样 在加一条新边时 我们看一下究竟该让左端点所在集合的boss节点继续当boss 还是右端点的
因为边是降序排的 所以当前边比之前所有边要短 如果把右集合都合并到左集合 那右集合中所有节点到左集合boss节点的运输能力都取决于当前枚举到的边 反之一样
然后比较一下决定靠左还是靠右 二选一即可 这也是此题的巧妙之处
最后只一个boss节点 即为所求
想了很久也没啥思路.. 看了博客才知道 原来并查集还能这么玩
根据题意 两点之间的运输能力取决于最小边
先把所有边降序排序 然后按照生成树的套路一条一条加 这样就满足了一定的单调性
同时并查集要增加两个维护对象 一个是本集合中所有点的数目 一个是本集合中所有点到boss节点的运输能力之和
这样 在加一条新边时 我们看一下究竟该让左端点所在集合的boss节点继续当boss 还是右端点的
因为边是降序排的 所以当前边比之前所有边要短 如果把右集合都合并到左集合 那右集合中所有节点到左集合boss节点的运输能力都取决于当前枚举到的边 反之一样
然后比较一下决定靠左还是靠右 二选一即可 这也是此题的巧妙之处
最后只一个boss节点 即为所求
#include <bits/stdc++.h> using namespace std; #define ll long long struct node { int u; int v; ll w; }; node edge[200010]; ll sum[200010]; int f[200010],num[200010]; int n,m; int cmp(node n1,node n2) { return n1.w>n2.w; } void unite(int u,int v,ll w); int getf(int p); int main() { int i,j; while(scanf("%d",&n)!=EOF) { m=n-1; for(i=1;i<=m;i++) { scanf("%d%d%lld",&edge[i].u,&edge[i].v,&edge[i].w); } sort(edge+1,edge+m+1,cmp); for(i=1;i<=n;i++) { f[i]=i; num[i]=1; sum[i]=0; } for(i=1;i<=m;i++) { unite(edge[i].u,edge[i].v,edge[i].w); } for(i=1;i<=n;i++) { if(f[i]==i) { printf("%lld\n",sum[i]); break; } } } return 0; } void unite(int u,int v,ll w) { int fu,fv; fu=getf(u); fv=getf(v); if(num[fv]*w+sum[fu]>num[fu]*w+sum[fv]) { f[fv]=fu; num[fu]+=num[fv]; sum[fu]+=num[fv]*w; num[fv]=0; sum[fv]=0; } else { f[fu]=fv; num[fv]+=num[fu]; sum[fv]+=num[fu]*w; num[fu]=0; sum[fu]=0; } return; } int getf(int p) { if(p==f[p]) return f[p]; else { f[p]=getf(f[p]); return f[p]; } }
相关文章推荐
- HDU 4424 Conquer a New Region 并查集
- HDU 4424 Conquer a New Region 最大生成树
- HDU 4424 Conquer a New Region(分治 并查集 最大生成树)
- HDU 4424 Conquer a New Region【贪心+并查集】
- hdu 4424 Conquer a New Region 并查集
- hdu 4424 Conquer a New Region
- HDU 4424 Conquer a New Region 最大生成树
- HDU 4424 Conquer a New Region (最小生成树+贪心)
- HDU 4424 Conquer a New Region
- HDU 4424 Conquer a New Region
- HDU 4424 - Conquer a New Region(最大生成树)
- HDU - 4424 Conquer a New Region(Kruskal的应用)
- HDU-4424 Conquer a New Region(并查集)
- HDU 4424 Conquer a New Region (并查集)
- 【并查集】 HDU 4424 Conquer a New Region 贪心
- HDU 4424 Conquer a New Region【并查集】【思维题】
- hdu 4424 Conquer a New Region(并查集)
- Conquer a New Region HDU - 4424 (并查集)
- hdu 4424 Conquer a New Region
- 【并查集】 HDU 4424 Conquer a New Region 贪心