暑假集训(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 }