SDAU练习四1006

来源:互联网 发布:ubuntu查看ip 编辑:程序博客网 时间:2024/05/21 10:43

题目编号:1006

题目大意:一个人维护道路,但是因为费用的缘故,所以只能维护部分的。求用最小的费用来维护道路,使这些道路把所有的城市连通。

解题思路:很是典型的求最小生成树,与并查集的算法结合来求解。还是前面那一套,结构体,排序,合并,求值。还用 的Kruskal算法。

感想:比较经典的题目,代码有参考成分。

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<algorithm>  
  3. using namespace std;  
  4. char p[1000];  
  5. int n,k;  
  6. struct road  
  7. {  
  8. char s,e;  
  9. int w;  
  10. }r[1000];  
  11. bool cmp(road a,road b)  
  12. { return a.w<b.w; }  
  13. char find(char x)  
  14. { return p[x]==x?x:p[x]=find(p[x]); }  
  15. int YJY()  
  16. {  
  17. int sum=0;  
  18. for(int i=0;i<k;i++)  
  19. {  
  20. char x=find(r[i].s),y=find(r[i].e);  
  21. if(x!=y)  
  22. {  
  23. p[x]=y;  
  24. sum+=r[i].w;  
  25. }  
  26. }  
  27. return sum;  
  28. }  
  29. int main()  
  30. {  
  31. while(cin>>n&&n)  
  32. {  
  33. char rs,re;  
  34. int m,rw;  
  35. k=0;  
  36. n--;  
  37. while(n--)  
  38. {  
  39. cin>>rs>>m;  
  40. while(m--)  
  41. {  
  42. cin>>re>>rw;  
  43. r[k].s=rs;  
  44. r[k].e=re;  
  45. r[k].w=rw;  
  46. k++;  
  47. }  
  48. }  
  49. for(char i='A';i<='Z';i++)  
  50. p[i]=i;  
  51. sort(r,r+k,cmp);  
  52. cout<<YJY()<<endl;  
  53. }  
  54. return 0;  
  55. }  
0 0
原创粉丝点击