Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <iterator>
- #include <set>
- using namespace std;
- void mergesort(long *weight, long *x, long *y, long l, long r)
- {
- long j=l, k, i;
- long m[r], cpyx[r], cpyy[r];
- long middle;
- middle = (r + l) / 2;
- k = middle + 1;
- for (i = l; i <= r; i++)
- {
- if (((k > r) || (weight[j] < weight[k])) && (j <= middle))
- {
- m[i] = weight[j];
- cpyx[i] = x[j];
- cpyy[i] = y[j];
- j ++;
- }
- else
- {
- m[i] = weight[k];
- cpyx[i] = x[k];
- cpyy[i] = y[k];
- k ++;
- }
- }
- for (i = l; i <= r; i++)
- {
- weight[i] = m[i];
- x[i] = cpyx[i];
- y[i] = cpyy[i];
- }
- };
- void merge(long *weight, long *x, long* y, long l, long r)
- {
- if (l < r)
- {
- merge(weight, x, y, l, (l + r) / 2);
- merge(weight, x, y, (l + r) / 2 + 1, r);
- mergesort(weight, x, y, l, r);
- }
- };
- int main()
- {
- long n, m, i;
- // freopen("spantree3.in", "r", stdin);
- // freopen("spantree3.out", "w", stdout);
- cin >> n >> m;
- long x[m], y[m], weight[m];
- set <long> comp[n];
- vector<long> flags;
- for (i = 1; i <= m; i++)
- cin >> x[i] >> y[i] >> weight[i];
- flags.resize(n);
- for (i = 1; i <= n; i++)
- flags[i] = 0;
- merge(weight, x, y, 1, m);
- long long sum = 0;
- long k = 1;
- for (i = 1; i <= m; i++)
- {
- if (((flags[x[i]] == 0) && (flags[y[i]] == 0)) && (x[i] != y[i]))
- {
- comp[k].insert(x[i]);
- comp[k].insert(y[i]);
- flags[x[i]] = k;
- flags[y[i]] = k;
- k++;
- sum += weight[i];
- }
- else
- {
- if ((flags[x[i]] != 0) && (flags[y[i]] == 0))
- {
- flags[y[i]] = flags[x[i]];
- comp[flags[x[i]]].insert(y[i]);
- sum += weight[i];
- }
- else
- {
- if ((flags[y[i]] != 0) && (flags[x[i]] == 0))
- {
- flags[x[i]] = flags[y[i]];
- comp[flags[y[i]]].insert(x[i]);
- sum += weight[i];
- }
- else
- if ((flags[x[i]] != 0) && (flags[y[i]] != 0) && (flags[x[i]] != flags[y[i]]))
- {
- int cop = flags[y[i]];
- for (auto z:comp[flags[y[i]]])
- {
- comp[flags[x[i]]].insert(z);
- flags[z] = flags[x[i]];
- }
- sum += weight[i];
- }
- }
- }
- }
- cout << sum;
- return 0;
- }
- /*
- 4 4
- 1 2 1
- 2 3 2
- 3 4 5
- 4 1 4
- */
- /*
- 4 3
- 1 3 1
- 1 2 2
- 2 4 1
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement