Kruskal修复公路

安昙

2018-07-16 21:03:48

Personal

```cpp #include<iostream> #include<algorithm> using namespace std; int n,m; int f[200000]; struct node { int x,y,t; }a[200000]; int getfather(int x) { if(f[x]==x) { return x; } else return f[x]=getfather(f[x]); } int cmp(node a,node b) { return a.t<b.t; } int ans; int k; int maxx=0; void kruskal() { int fa1,fa2; for(int i=1;i<=m;i++)//枚举这m条边 { fa1=getfather(a[i].x); fa2=getfather(a[i].y); if(fa1!=fa2)//每次选择两个不同集合的端点 { maxx=max(maxx,a[i].t); ans+=a[i].t; f[fa1]=fa2;//把两个点连起来 k++;//边数++ if(k==n-1)break;//因为n个点最多只需n-1条边就可以连起来 } } if(k<n-1) { cout<<"-1";//不连通 return; } cout<<maxx<<endl; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) cin>>a[i].x>>a[i].y>>a[i].t;//第i条边的两个端点及权值 for(int i=1;i<=n;i++) f[i]=i; sort(a+1,a+m+1,cmp);//排序很重要,为之后的贪心做准备 kruskal(); } ```