暑假集训(3)第二弹 -----Jungle Roads(Hdu1301)
生活随笔
收集整理的這篇文章主要介紹了
暑假集训(3)第二弹 -----Jungle Roads(Hdu1301)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
問題梗概:自從上次某個acmer來設(shè)計了拉格瑞圣島的交通路線后,島上的酋長就相當(dāng)苦惱,他發(fā)現(xiàn),雖然這些修好的公路便利了島上的
交通,并且讓拉格瑞圣島的旅游業(yè)更加興旺,甚至他們還收到了一筆不小的國際資金援助以發(fā)展島嶼,但是為了維護(hù)這些公路,不被熱帶
地區(qū)的恐怖植物覆蓋,他必須拿出一筆不小的財富。這很大程度上影響了島嶼的經(jīng)濟(jì)發(fā)展。
為了真正發(fā)展普世價值精神,你決定去幫助他,找到最短的連接島上n(1<n<27)個村莊的簡單連通圖。以便得知那些路是可以放棄繼續(xù)
維護(hù)的。
?
解題思路:和第一彈的連接問題相似,不過這個圖的稠密程度不是很高,考慮使用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?
轉(zhuǎn)載于:https://www.cnblogs.com/huas-zlw/p/5706934.html
總結(jié)
以上是生活随笔為你收集整理的暑假集训(3)第二弹 -----Jungle Roads(Hdu1301)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 226. Invert Binary T
- 下一篇: 转载 素性测试