标签:RKE algo 接下来 data- bsp ssi break 超过 pen
奶牛爱干草
Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发。农场之间总共有M (1 <= M <= 10,000)条双向道路,所有道路的总长度不超过1,000,000,000。有些农场之间存在着多条道路,所有的农场之间都是连通的。
Bessie希望计算出该图中最小生成树中的最长边的长度。
两个整数N和M。
接下来M行,每行三个用空格隔开的整数A_i, B_i和L_i,表示A_i和 B_i之间有一条道路长度为L_i。
一个整数,表示最小生成树中的最长边的长度。
3 3
1 2 23
2 3 1000
1 3 43
43
【解题思路】
最小生成树Kruskal
判断最长边就OK了
【code】
1 #include <cstdio>
2 #include <iostream>
3 #include <algorithm>
4 using namespace std;
5 int n,m,k,ans=-1<<30;
6 int fa[10005];
7 struct Node{
8 int x;
9 int y;
10 int z;
11 }a[10005];
12 inline bool cmp(const Node &a,const Node &b){
13 return a.z<b.z;
14 }
15 inline int Find(int i){
16 if(fa[i]==i)return i;
17 return fa[i]=Find(fa[i]);
18 }
19 inline void Kruskal(){
20 for(register int i=1;i<=m;i++){
21 if(Find(a[i].x)!=Find(a[i].y)){
22 int f1=Find(a[i].x);
23 int f2=Find(a[i].y);
24 if(f1!=f2)fa[f1]=f2;
25 k++;
26 if(a[i].z>ans)ans=a[i].z;
27 }
28 if(k==n-1)break;
29 }
30 }
31 int main(){
32 //freopen("1547.in","r",stdin);
33 //freopen("1547.out","w",stdout);
34 scanf("%d%d",&n,&m);
35 for(register int i=1;i<=m;i++)
36 scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
37 for(register int i=1;i<=n;i++)
38 fa[i]=i;
39 sort(a+1,a+m+1,cmp);
40 Kruskal();
41 printf("%d\n",ans);
42 return 0;
43 }
标签:RKE algo 接下来 data- bsp ssi break 超过 pen
原文地址:https://www.cnblogs.com/66dzb/p/11515472.html