度度熊的王国战略
Accepts: 674Submissions: 6056Time Limit: 40000/20000 MS (Java/Others)Memory Limit: 32768/132768 K (Java/Others)Problem Description度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族。
哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士。
所以这一场战争,将会十分艰难。
为了更好的进攻哗啦啦族,度度熊决定首先应该从内部瓦解哗啦啦族。
第一步就是应该使得哗啦啦族内部不能同心齐力,需要内部有间隙。
哗啦啦族一共有n个将领,他们一共有m个强关系,摧毁每一个强关系都需要一定的代价。
现在度度熊命令你需要摧毁一些强关系,使得内部的将领,不能通过这些强关系,连成一个完整的连通块,以保证战争的顺利进行。
请问最少应该付出多少的代价。
Input本题包含若干组测试数据。
第一行两个整数n,m,表示有n个将领,m个关系。
接下来m行,每行三个整数u,v,w。表示u将领和v将领之间存在一个强关系,摧毁这个强关系需要代价w
数据范围:
2<=n<=3000
1<=m<=100000
1<=u,v<=n
1<=w<=1000
Output对于每组测试数据,输出最小需要的代价。
Sample Input2 1 1 2 1 3 3 1 2 5 1 2 4 2 3 3Sample Output1 3
题目大意:将敌方的分成至少两个集合。问怎么样离间使得代价最小。
思路:这题目比03水多了,只需要并查集先判断是否是一个整体,如果不是输出0,是就找出该集合中具有权值最小的元素,它的权值就是最小的代价。
AC代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 int sum[3050]; 7 int pr[3050]; 8 int Find(int x){ 9 if(x==pr[x]) return x; 10 else{ 11 pr[x]=Find(pr[x]); 12 return pr[x]; 13 } 14 } 15 int join(int x,int y){ 16 int fx=Find(x); 17 int fy=Find(y); 18 if(fx!=fy){ 19 pr[fy]=pr[fx]; 20 } 21 } 22 int main(){ 23 int n,m; 24 while(~scanf("%d%d",&n,&m)){ 25 memset(sum,0,sizeof(sum)); 26 for(int i=1;i<=3020;i++){ 27 pr[i]=i; 28 } 29 int x,y,z; 30 for(int i=0;i<m;i++){ 31 scanf("%d%d%d",&x,&y,&z); 32 if(x!=y){ 33 sum[x]+=z; 34 sum[y]+=z; 35 } 36 join(x,y); 37 } 38 int fa=Find(1); 39 bool flag=true; 40 for(int i=1;i<=n;i++){ 41 if(fa!=Find(i)){ 42 flag=false; 43 break; 44 } 45 } 46 if(!flag){ 47 cout<<0<<endl; 48 continue; 49 }else{ 50 int mn=99999999; 51 for(int i=1;i<=n;i++){ 52 mn=min(mn,sum[i]); 53 } 54 cout<<mn<<endl; 55 } 56 } 57 return 0; 58 }