最小生成树MST
Description
生成树:一个有n个结点的连通图的生成树是原图的极小连通子图,包含原图中的所有n个结点,并且有保持图连通的最少的边。
最小生成树:生成树中权值最小的一种方案。
给定一个无向图,请输出最小生成熟的权值。
存在重边
Input
第一行包含三个整数N、M,分别表示点的个数、边的个数;
接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条边的两个点和长度。
Output
输出最小生成熟的权值,如果答案不存在,请输出-1。
Sample Input
4 6 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4
Sample Output
5
Hint
对于100%的数据:N<=1000,M<=400000
Source
#include <bits/stdc++.h> using namespace std; int n,m; struct point { int a,b,val; }; point p[400001]; int f[1001]; bool cmp(point x,point y) { return x.val<y.val; } int find(int x) { if(x==f[x]) return x; f[x]=find(f[x]); return f[x]; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].val); } sort(p+1,p+1+m,cmp); for(int i=0;i<=n;i++) f[i]=i; int ans=0,cnt=0; for(int i=1;i<=m;i++) { int fa=find(p[i].a); int fb=find(p[i].b); if(fa!=fb) { ans+=p[i].val; f[fa]=fb; cnt++; } } if(cnt=n-1) cout<<ans<<endl; else cout<<-1<<endl; return 0; }