nyoj-38-布线问题

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<math.h>
 5 using namespace std;
 6 struct build
 7 {
 8     int b,e,num;
 9 }bu[125000];
10 bool cmp(build a,build b)
11 {
12     return a.num<b.num;
13 }
14 int p[510];
15 int find(int n)
16 {
17     return p[n]==n?n:p[n]=find(p[n]);
18 }
19 int kruskal(int m)
20 {
21     int sum=0,i;
22     for(i=0;i<510;i++)
23         p[i]=i;
24     sort(bu,bu+m,cmp);
25     for(i=0;i<m;i++)
26     {
27         int x,y; x=find(bu[i].b);y=find(bu[i].e);
28         if(x!=y)
29         {
30             sum+=bu[i].num;
31             p[x]=y;
32         }
33     }
34     return sum;
35 }
36 
37 int main()
38 {
39     int n,v,e,i,a;
40     scanf("%d",&n);
41     while(n--)
42     {
43         scanf("%d%d",&v,&e);
44         for(i=0;i<e;i++)
45         scanf("%d%d%d",&bu[i].b,&bu[i].e,&bu[i].num);
46         int min=7634634;
47         for(i=0;i<v;i++)
48         {
49             scanf("%d",&a);
50             if(a<min)
51             min=a;
52         }
53         printf("%d\n",min+kruskal(e));
54     }
55     return 0;
56 }

布线问题  思路 并查集   初始每个城市是一个集合  然后从距离最短的找 不属于一个集合  那么就合并为一个集合   最后的集合就是整个线路了 

posted @ 2013-07-20 16:46  nylg-haozi  阅读(142)  评论(0编辑  收藏  举报