摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
最优布线问题 ★☆☆☆☆ 答案正确 100 2015-7-25 18:53:44

题解

CodeVS/1078改了几行就是了。

代码

显示/移除行号
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<set>
  5. #include<iterator>
  6. #include<queue>
  7. #include<cstring>
  8. #include<climits>
  9. #include<cmath>
  10. #include<string>
  11. #include<map>
  12. #include<cstdlib>
  13. using namespace std;
  14. #define foreach(i,a) for(typeof(a.begin()) i=a.begin();i!=a.end();++i)
  15. #define v2 pair<int,int>
  16. #define v3 pair<int, v2 >
  17. #define x first
  18. #define xx x
  19. #define yy second
  20. #define y yy.xx
  21. #define z yy.yy
  22. #define m2 make_pair
  23. #define m3(a,b,c) make_pair(a,make_pair(b,c))
  24. #define s(x) scanf("%d",&x)
  25. vector<int> where[100010];
  26. vector<int> dis[100010];
  27. void sp(v2 &p)
  28. {
  29. s(p.xx);s(p.yy);
  30. }
  31. struct path//路径//
  32. {
  33. int len;//长度//
  34. v2 FAT;//连接的点//
  35. friend bool operator<(path a, path b) { return a.len>b.len; }
  36. path() :len(0), FAT() {}
  37. path(int f, int t)
  38. {
  39. len = dis[f][t];
  40. FAT.xx = f;
  41. FAT.yy = where[f][t];
  42. }
  43. };
  44. set<int> r;//已经加入生成树的点集//
  45. priority_queue< path > x;//存放将要放入生成树的堆//
  46. int main()
  47. {
  48. long long totalLen = 0;
  49. int n,m;
  50. //读入数据//
  51. s(n);
  52. s(m);
  53. for (int i = 1;i <= m;++i)
  54. {
  55. int a,b,t;
  56. s(a);s(b);s(t);
  57. dis[a].push_back(t);
  58. dis[b].push_back(t);
  59. where[a].push_back(b);
  60. where[b].push_back(a);
  61. }
  62. //将与节点1相连的边插入堆//
  63. for (int i = 0;i < dis[1].size();++i)
  64. x.push(path(1, i));
  65. r.insert(1);//节点1放入生成树//
  66. while (r.size() != n&&!x.empty())//树非空//
  67. {
  68. path t = x.top();
  69. x.pop();
  70. bool ha = r.count(t.FAT.xx), hb = r.count(t.FAT.yy);
  71. int next = 0;
  72. if (!ha)next = t.FAT.xx;
  73. if (!hb)next = t.FAT.yy;
  74. if (next)
  75. {
  76. r.insert(next);//加入点//
  77. totalLen += t.len;
  78. for (int to = 0;to < dis[next].size();++to)
  79. if (!r.count(where[next][to]))
  80. x.push(path(next,to));//相连路径加入堆//
  81. }
  82. }
  83. cout << totalLen << endl;
  84. }

著作权声明[编辑]

关于[编辑]