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 }

 

posted @ 2022-04-22 21:28  爱吃虾滑  阅读(65)  评论(0编辑  收藏  举报