题目链接:https://www.luogu.org/problemnew/show/P1111
考察并查集,运用kruskal的思想很好做。注意几个小问题即可。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,m,fa[1000010]; 6 int ans=0,cnt=0; 7 struct node{ 8 int x,y,t; 9 }s[1000010]; 10 int cmp(node a,node b) 11 { 12 return a.t<b.t; 13 } 14 int find(int x) 15 { 16 return fa[x]==x?x:fa[x]=find(fa[x]); 17 } 18 int main() 19 { 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;i++) 22 fa[i]=i; 23 24 for(int i=1;i<=m;i++) 25 scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].t); 26 sort(s+1,s+1+m,cmp); 27 28 for(int i=1;i<=m;i++) 29 { 30 int xx=find(s[i].x); 31 int yy=find(s[i].y); 32 if(xx!=yy) 33 { 34 fa[yy]=xx; 35 cnt++; 36 } 37 if(cnt==n-1)//注意是点数-1,点数-1条边生成的图是树 38 { 39 cout<<s[i].t;//因为已经是排好序的,所以直接是当前的边序号 40 return 0; 41 } 42 } 43 44 cout<<-1; 45 return 0; 46 47 }