标签:
1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0
0 17 16 26
求最小生成树基本思想
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,m,fa[100000],i,sum,k; 5 6 struct stu 7 { 8 int from,to,al; 9 }st[1000000]; 10 11 bool cmp(stu a,stu b) 12 { 13 return a.al < b.al; 14 } 15 16 int find(int a) 17 { 18 int r=a; 19 while(r!=fa[r]) 20 { 21 r=fa[r]; 22 } 23 return r; 24 } 25 26 void init() 27 { 28 for(i = 1 ; i <= n ;i++) 29 { 30 fa[i]=i; 31 } 32 } 33 34 int judge(int x,int y) 35 { 36 int xx=find(x); 37 int yy=find(y); 38 if(xx != yy) 39 { 40 fa[xx]=yy; 41 return 1; 42 } 43 return 0; 44 } 45 46 47 int main() 48 { 49 while(scanf("%d",&n) && n) 50 { 51 init(); 52 scanf("%d",&m); 53 for(i = 0 ; i < m ; i++) 54 { 55 scanf("%d %d %d",&st[i].from,&st[i].to,&st[i].al); //定义结构体保存两节点及其距离 56 } 57 sort(st,st+m,cmp); //对结构体排序(按两节点距离从小到大) 58 int k = 0; 59 int sum=0; 60 for(i = 0 ; k < n-1 ; i++) //对边的数量进行查询 61 { 62 if(judge(st[i].from,st[i].to)) //若两节点父节点不同则连接两父节点 63 { 64 k++; // 65 sum+=st[i].al; 66 } //在循环中判断有效边数量,若等于节点数减一则结束循环(写在循环里看k<n-1 ) 67 } 68 printf("%d\n",sum); 69 } 70 }
POJ 1287 Networking (最小生成树模板题)
标签:
原文地址:http://www.cnblogs.com/yexiaozi/p/5735489.html