HDU1233还是畅通工程(并查集+Kruskal)
这道题比1232多了一个条件就是距离,也就是边的权值,建议参考Kruskal算法http://baike.baidu.com/view/247951.htm
思想就是以前做题所用的贪心思想
附代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include <algorithm> 4 #define max(a,b) (a)>(b)?(a):(b) 5 #define min(a,b) (a)<(b)?(a):(b) 6 using namespace std; 7 8 const int MAXN=100 + 5; 9 const int MAX=5050; 10 int min_len=0; 11 struct bin{int x,y,len;}road[MAX]; 12 int p[MAXN]; 13 14 int find(int x) 15 { 16 while(x!=p[x]) 17 x=p[x]; 18 return x; 19 } 20 21 int cmp(bin a,bin b) 22 { 23 return a.len<b.len; 24 } 25 void Kruskal(int m) 26 { 27 int i; 28 sort(road,road+m,cmp); 29 for(i=0;i<m;i++) 30 { 31 int a=find(road[i].x),b=find(road[i].y); 32 if(a!=b) 33 { 34 min_len+=road[i].len; 35 p[max(a,b)]=min(a,b); 36 } 37 } 38 } 39 int main() 40 { 41 int n; 42 while(scanf("%d",&n)&&n) 43 { 44 int m=(n*(n-1))/2; 45 min_len=0; 46 int i; 47 for(i=1;i<=n;i++)p[i]=i; 48 for(i=0;i<m;i++)scanf("%d%d%d",&road[i].x,&road[i].y,&road[i].len); 49 Kruskal(m); 50 printf("%d\n",min_len); 51 } 52 return 0; 53 }