P1111 修复公路
题目链接 https://www.luogu.com.cn/problem/P1111
Kruskal求最小生成树最大边
差不多个板子了,怎么总是感觉找不到想做的那种题呢
放AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m;//村庄数、公路数 4 int maxnum=-1; 5 int cnt; 6 int p[200010]; 7 struct Edge 8 { 9 int x; 10 int y; 11 int t; 12 }edge[200010]; 13 14 bool cmp(Edge a,Edge b) 15 { 16 return a.t<b.t; 17 } 18 19 int Find(int o) 20 { 21 return p[o]==o?o:Find(p[o]); 22 } 23 24 int kruskal() 25 { 26 for(register int i=1;i<=n;i++) 27 { 28 p[i]=i; 29 } 30 sort(edge+1,edge+1+m,cmp); 31 for(register int i=1;i<=m;i++) 32 { 33 int x=Find(edge[i].x); 34 int y=Find(edge[i].y); 35 if(x==y) 36 continue; 37 maxnum=max(maxnum,edge[i].t); 38 cnt++; 39 p[y]=x; 40 if(cnt==n-1) 41 break; 42 } 43 return maxnum; 44 } 45 46 int main() 47 { 48 cin>>n>>m; 49 for(int i=1;i<=m;i++) 50 cin>>edge[i].x>>edge[i].y>>edge[i].t; 51 kruskal(); 52 if(cnt>=n-1) 53 cout<<maxnum; 54 else 55 cout<<-1; 56 return 0; 57 }