Source code for submission s811

spider.cpp

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. struct edge {
  7. int u, v, l;
  8. bool operator<(const edge & rhs) const
  9. { return l < rhs.l; }
  10. };
  11.  
  12. vector<int> UF;
  13. vector<int> CS;
  14.  
  15. int find_set(int n) {
  16. if (n != UF[n])
  17. UF[n] = find_set(UF[n]);
  18. return UF[n];
  19. }
  20. bool connected(int u, int v)
  21. {
  22. return (find_set(u) == find_set(v));
  23. }
  24. void connect(int u, int v)
  25. {
  26. UF[u] = UF[v];
  27. CS[u] = CS[v] = CS[u] + CS[v];
  28. }
  29.  
  30. int main()
  31. {
  32. ios_base::sync_with_stdio(false);
  33. int N, M;
  34. while (cin >> N) {
  35. cin >> M;
  36. vector<edge> E (M);
  37. UF = vector<int> (N+1);
  38. CS = vector<int> (N+1);
  39. long netl = 0;
  40.  
  41. // UF
  42. for (int i = 0; i <= N; ++i) {
  43. UF[i] = i;
  44. CS[i] = 1;
  45. }
  46.  
  47. // load and sort
  48. for (int i = 0; i < M; ++i) {
  49. edge e;
  50. cin >> e.u >> e.v >> e.l;
  51. E[i] = e;
  52. }
  53. sort (E.begin(), E.end());
  54.  
  55. // connect longest
  56. edge longest = E.back();
  57. netl -= longest.l;
  58. connect(longest.u, longest.v);
  59. E.pop_back(); --M;
  60.  
  61. bool all = false; int ei = 0;
  62. while (ei < M && !all) {
  63. edge e = E[ei];
  64. if (!connected(e.u, e.v)) {
  65. connect(e.u, e.v);
  66. netl += e.l;
  67. if (CS[e.u] == N)
  68. all = true;
  69. }
  70. ++ei;
  71. }
  72.  
  73. if (all) cout << netl << '\n';
  74. else cout << "disconnected\n";
  75. }
  76. return 0;
  77. }
  78.