1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxx=0x3f3f3f3f; 4 const int maxn=10000; 5 struct node 6 { 7 int u,v,l; 8 bool operator <(const node &a)const 9 { 10 return l<a.l; 11 } 12 }edge[maxn]; 13 int father[maxn]; 14 int nodenum,edgenum; 15 void init() 16 { 17 for(int i=0;i<nodenum;i++) 18 { 19 father[i]=i; 20 } 21 } 22 int Find(int x) 23 { 24 while(father[x]!=x) 25 { 26 x=father[x]; 27 } 28 return x; 29 } 30 void Union(int x,int y) 31 { 32 int temp_x=Find(x); 33 int temp_y=Find(y); 34 if(temp_x!=temp_y) 35 { 36 father[temp_x]=temp_y; 37 } 38 } 39 int kruskal() 40 { 41 sort(edge,edge+edgenum); 42 init(); 43 node now; 44 int ans=0; 45 for(int i=0;i<edgenum;i++) 46 { 47 now=edge[i]; 48 if(Find(now.u)!=Find(now.v)) 49 { 50 Union(now.u,now.v); 51 ans+=now.l; 52 } 53 } 54 return ans; 55 } 56 int main() 57 { 58 while(scanf("%d %d",&edgenum,&nodenum)&&edgenum) 59 { 60 for(int i=0;i<edgenum;++i) 61 { 62 scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].l); 63 } 64 int ans=kruskal(); 65 bool flag=0; 66 for(int i=2;i<=nodenum;i++) 67 { 68 if(Find(1)!=Find(i)) 69 { 70 flag=1; 71 break; 72 } 73 } 74 if(flag) 75 { 76 cout<<"?"<<'\n'; 77 } 78 else 79 { 80 cout<<ans<<'\n'; 81 } 82 } 83 return 0; 84 }
【最小生成树】kruskal模板
猜你喜欢
转载自www.cnblogs.com/guanwen769aaaa/p/11243387.html
今日推荐
周排行