Hrbust 1849 商品中心【贪心+思维+并查集】好题!好题!
来源:互联网 发布:查询pid占用了哪个端口 编辑:程序博客网 时间:2024/05/23 18:38
商品中心Time Limit: 2000 MSMemory Limit: 32768 KTotal Submit: 7(5 users)Total Accepted: 3(3 users)Rating: Special Judge: NoDescription
第一行是一个整数N(1<=N<=200000)
接下来N-1行每行三个整数a,b,c表明城镇a和城镇b之间道路运送商品容量为c。Output对于每组测试数据,输出一个整数商品中心到其他所有的城镇运送商品容量和最大值。Sample Input4
1 2 2
2 4 1
2 3 1
4
1 2 1
2 4 1
2 3 1Sample Output4
3
有N个城镇(编号从1到N)城镇之间有一些双向道路相连,并且保证任意两个城镇之间只有一条唯一的路线。
每一条道路都有一个运送商品的容量。
假设城镇i到城镇j有一条路线,我们定义城镇i向城镇j运送商品的容量等于路线中道路运送商品的容量的最小值。
现在想建一个商品中心,并且要求商品中心到其他所有的城镇运送商品容量和最大。
Input有多组测试数据第一行是一个整数N(1<=N<=200000)
接下来N-1行每行三个整数a,b,c表明城镇a和城镇b之间道路运送商品容量为c。Output对于每组测试数据,输出一个整数商品中心到其他所有的城镇运送商品容量和最大值。Sample Input4
1 2 2
2 4 1
2 3 1
4
1 2 1
2 4 1
2 3 1Sample Output4
3
思路:
(一开始以为是树型Dp.怎么写都感觉复杂度爆炸,后来感觉贪心可行,就走的贪心路,可能树型Dp可做,但是窝不会呀)
现在有一个最小权值作为约束,那么我们不妨先将所有边按照从大到小排序。
那么当前边的权值w,就是联通两个联通块的必经最小权值边。
那么对于当前这条边连接的两个联通块X.Y.要么我们让X中的一个点作为根,跑到Y中,使得这条边的贡献度为w*Y集合中点的个数,或者我们让Y中的一个点作为根,跑到X中,使得这条边的贡献度为w*X集合中点的个数。
无论我们怎样选,最终都会使得两个集合合并在一起。
那么我们肯定贪心去做,对于集合X.其中肯定有一个点作为根,已经跑遍了X中的其他所有点,其总权值和设定为ans【X】.对于结婚Y.也是肯定有一个点作为跟,已经跑遍了Y中的所有点,其总权值和设定为ans【Y】.根据贪心道理来讲,此时的X是局部贪心,Y也是局部贪心,那么两个局部贪心比较大小是可以得到整体贪心的。
那么我们连接两个点合并为同一连通块的时候,比较ans【X】+w*Y集合中点的个数和ans【Y】+w*X集合中点的个数的大小,让大的那边的根作为合并之后的集合的总根,达到当前局部最优贪心,从而不断的连接两个联通块,来得到整体的最优贪心。
Ac代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{ int x,y,w;}a[350000];int f[350000];int sum[350000];int ans[350000];int cmp(node a,node b){ return a.w>b.w;}int find(int a){ int r=a; while(f[r]!=r) r=f[r]; int i=a; int j; while(i!=r) { j=f[i]; f[i]=r; i=j; } return r;}int main(){ int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++)f[i]=i,sum[i]=1,ans[i]=0; for(int i=0;i<n-1;i++) { scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w); } sort(a,a+n-1,cmp); for(int i=0;i<n-1;i++) { int x=a[i].x; int y=a[i].y; int xx=find(x); int yy=find(y); int X=sum[find(x)]; int Y=sum[find(y)]; if(ans[yy]+X*a[i].w>ans[xx]+Y*a[i].w) { f[xx]=yy; sum[yy]+=sum[xx]; ans[yy]+=X*a[i].w; } else { f[yy]=xx; sum[xx]+=sum[yy]; ans[xx]+=Y*a[i].w; } } int output=0; for(int i=1;i<=n;i++) { output=max(output,ans[i]); } printf("%d\n",output); }}
阅读全文
0 0
- Hrbust 1849 商品中心【贪心+思维+并查集】好题!好题!
- Hrbust 2222 应援团补完计划【并查集+思维】好题~
- hrbust 1539 选课【思维+贪心】好题
- HRBUST1849商品中心(贪心+思维+并查集)
- Hrbust 1517 Summits【Bfs+思维+贪心】好题~
- hrbust 1774 succession【思维】好题
- Hrbust 1980 Failed【思维】好题!
- poj1017 贪心 思维 好题
- Hrbust 2063 萌萌哒十五酱的情书~【思维】好题!好题!好题!
- Hrbust 1846 方格涂色【dp+递推思维】好题!好题!好题!
- hrbust 1662 凸多边形【最短路SPFA+建图+思维】好题
- Hrbust 1650 Mac and Sequence【二进制思维】好题~
- Hrbust 2318 Mod【思维+连续二分】好题!
- hdu 5073 Galaxy【思维+贪心】好题
- hdu1325 并查集-好题
- Codeforces Round #385 (Div. 2)C. Hongcow Builds A Nation【并查集+贪心】好题~
- hrbust 1857 koko的能量值公式【思维+二分】好题!好题!
- Hrbust 1256 Province Region Competition Team Play【状压dp+分段处理思想+思维】好题!好题!好题!
- 跑步中的感受
- 雄才伟略,深谋远虑,立足国家,力排众议
- socket编程(十)
- Linux 下用exim4 bypass php disable_functions
- (回文串)Manacher算法
- Hrbust 1849 商品中心【贪心+思维+并查集】好题!好题!
- 字符串的排列组合问题-java
- 初学vue
- ACM 干货
- 继承AppCompatActivity的Activity无法隐藏标题栏
- Spring的生命周期分析
- 朴素贝叶斯算法学习笔记(三)显示地域相关的用词
- 【暑假复习】【搜索】POJ3009:Curling 2.0
- Bzoj 2038 莫队算法