Kruskal求最小生成樹
阿新 • • 發佈:2017-12-07
con sort ret += ace print int i++ clu
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn= 5e4+10; 4 const double eps= 1e-6; 5 const int inf = 0x3f3f3f3f; 6 const int mod =3; 7 typedef long long ll; 8 typedef long double ld; 9 int n,m; 10 int p[maxn]; 11 struct edge 12 { 13 int u,v,w; 14 }a[maxn]; 15 int cmp(edge a,edge b)16 { 17 return a.w<b.w; 18 } 19 int find(int x) 20 { 21 return p[x]==x?x:p[x]=find(p[x]); 22 } 23 int main() 24 { 25 while(scanf("%d %d",&n,&m)!=EOF) 26 { 27 int u,v,w; 28 for(int i=0;i<m;i++) 29 { 30 scanf("%d %d %d",&a[i].u,&a[i].v,&a[i].w);31 } 32 sort(a,a+m,cmp); 33 int sum=n,ans=0; 34 for(int i=1;i<=n;i++) 35 p[i]=i; 36 for(int i=0;i<m;i++) 37 { 38 int x,y,z; 39 x=find(a[i].u),y=find(a[i].v),z=a[i].w; 40 if(x!=y) 41 { 42 ans+=z;43 p[x]=y; 44 } 45 } 46 printf("%d\n",ans); 47 } 48 }
克魯斯卡爾求最小生成樹
Kruskal求最小生成樹