1. 程式人生 > >Kruskal求最小生成樹

Kruskal求最小生成樹

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求最小生成樹