Source code for submission s1275

spider.cpp

  1. #include <vector>
  2. #include <algorithm>
  3. #include <queue>
  4. #include <cstdio>
  5. using namespace std;
  6.  
  7. struct edge {
  8. int x, y, w;
  9. edge() {}
  10. edge(int x, int y, int w) : x(x), y(y), w(w) {}
  11. bool operator < (const edge &e) const {
  12. return w < e.w;
  13. }
  14. };
  15.  
  16. vector<int> parent;
  17. void init(int n) {
  18. parent.resize(n);
  19. for (int i = 0; i < n; ++i) {
  20. parent[i] = i;
  21. }
  22. }
  23.  
  24. int find(int i) {
  25. if (parent[i] == i) return i;
  26. parent[i] = find(parent[i]);
  27. return parent[i];
  28. }
  29.  
  30. void merge(int i, int j) {
  31. parent[find(i)] = find(j);
  32. }
  33.  
  34. edge kruskal(vector<edge> &g, vector<vector<pair<int, int> > > &tree, int n, bool &connected) {
  35. init(n);
  36. tree.assign(n, vector<pair<int, int> > ());
  37. sort(g.begin(), g.end());
  38. edge emax(-1, -1, 0);
  39. int cnt = 0;
  40. for(int i = 0; i < (int) g.size(); ++i) {
  41. if (find(g[i].x) != find(g[i].y)) {
  42. merge(g[i].x, g[i].y);
  43. tree[g[i].x].push_back(make_pair(g[i].y, g[i].w));
  44. tree[g[i].y].push_back(make_pair(g[i].x, g[i].w));
  45. ++cnt;
  46. } else
  47. emax = g[i];
  48. }
  49. connected = (cnt == n - 1);
  50. return emax;
  51. }
  52.  
  53. int bfs(vector<vector<pair<int, int> > > &t, int u, int v) {
  54. vector<bool> mark(t.size(), false);
  55. queue<pair<int, int> > q;
  56. q.push(make_pair(u, 0));
  57. mark[u] = true;
  58. while(not q.empty()) {
  59. int x = q.front().first;
  60. int l = q.front().second;
  61. q.pop();
  62. //printf("%d %d\n", x, l); fflush(stdout);
  63. if (x == v) return l;
  64. for (int i = 0; i < (int) t[x].size(); ++i) {
  65. int y = t[x][i].first;
  66. if (not mark[y]) {
  67. mark[y] = true;
  68. int nl = max(l, t[x][i].second);
  69. q.push(make_pair(y, nl));
  70. }
  71. }
  72. }
  73. return -1;
  74. }
  75.  
  76. int sum(vector<vector<pair<int, int> > > &t) {
  77. int s = 0;
  78. for (int x = 0; x < (int) t.size(); ++x)
  79. for (int i = 0; i < (int) t[x].size(); ++i) {
  80. s += t[x][i].second;
  81. //printf("%d %d %d\n", x, t[x][i].first, t[x][i].second);
  82. }
  83. return s / 2;
  84. }
  85.  
  86. int main() {
  87. int n, m;
  88. while(scanf("%d %d", &n, &m) == 2) {
  89. vector<edge> g;
  90. vector<vector<pair<int, int> > > t;
  91. for (int i = 0; i < m; ++i) {
  92. int u,v,l;
  93. scanf("%d %d %d", &u, &v, &l);
  94. --u; --v;
  95. g.push_back(edge(u, v, l));
  96. }
  97. bool connected = true;
  98. edge e = kruskal(g, t, n, connected);
  99. int cost = sum(t) - e.w;
  100. if (e.x < 0)
  101. cost -= e.w;
  102. else
  103. cost -= bfs(t, e.x, e.y);
  104. if (not connected)
  105. printf("disconnected\n");
  106. else
  107. printf("%d\n", cost);
  108. }
  109. }
  110.