代码改变世界

暑假集训(3)第二弹 -----Jungle Roads(Hdu1301)

2016-07-26 11:47  HUAS_周林微  阅读(147)  评论(0编辑  收藏  举报

问题梗概:自从上次某个acmer来设计了拉格瑞圣岛的交通路线后,岛上的酋长就相当苦恼,他发现,虽然这些修好的公路便利了岛上的

交通,并且让拉格瑞圣岛的旅游业更加兴旺,甚至他们还收到了一笔不小的国际资金援助以发展岛屿,但是为了维护这些公路,不被热带

地区的恐怖植物覆盖,他必须拿出一笔不小的财富。这很大程度上影响了岛屿的经济发展。

为了真正发展普世价值精神,你决定去帮助他,找到最短的连接岛上n(1<n<27)个村庄的简单连通图。以便得知那些路是可以放弃继续

维护的。

 

解题思路:和第一弹的连接问题相似,不过这个图的稠密程度不是很高,考虑使用kruskal算法解决问题。

 

 1 #include "iostream"
 2 #include "algorithm"
 3 
 4 using namespace std;
 5 int beg[100];
 6 int end[100];
 7 int v[27];
 8 int num[100];
 9 int size[100];
10 int s;
11 void mset(int n)
12 {
13     for (int i=1;i<=n;i++)
14         v[i] = i;
15 }
16 int cmp(int x,int y)
17 {
18     return size[x] < size[y];
19 }
20 int findroot(int x)
21 {
22     while (x != v[x])
23     {
24         v[x] = v[v[x]];
25         x = v[x];
26     }
27     return x;
28 }
29 void kru (int n)
30 {
31     int x,y,sum=0;
32     sort (num+1,num+s+1,cmp);
33     for (int i=1;i<=s;i++)
34     {
35         x = findroot(beg[num[i]]);
36         y = findroot(end[num[i]]);
37         if (x != y)
38             {
39                 sum += size[num[i]];
40                 v[y] = x;
41             }
42     }
43     cout<<sum<<endl;
44 }
45 int main()
46 {
47     int n,m,l,k;
48     char c,d;
49     while (cin>>n && n)
50     {
51       mset(n);
52       k=1;
53       s=0;
54       for (int i=1;i<=n-1;i++)
55       {
56         cin>>c>>m;
57         s += m;
58         while (m--)
59         {
60             cin>>d>>l;
61             beg[k] = int (c-64);
62             end[k] = int (d-64);
63             size[k] = l;
64             num[k] = k++;
65         }
66       }
67       kru(n);
68     }
69     return 0;
70 }
View Code