Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <vector>
- using namespace std;
- struct edge{ // структура для ребра вес-вершина1-вершина2
- int w, v1, v2;
- };
- struct king { // структура для хранения "имени" короля и количества "подданных"
- int name, num;
- };
- bool cmp(edge v1, edge v2) {
- return v1.w < v2.w;
- }
- vector <edge> edges;
- vector <king> kingdom;
- int n, m, sum;
- int find_king(int v) {
- if (kingdom[v].name == v)return kingdom[v].name; // если вершина - сама себе король, возвращаем её
- kingdom[v] = kingdom[find_king(kingdom[v].name)]; // иначе "спрашиваем" у её правителя
- return kingdom[v].name;
- }
- void unite(int v1, int v2) {
- if (kingdom[v1].num > kingdom[v2].num)swap(v1, v2); // Проверяем размер "стран" что бы понять, какая должна присоединиться
- kingdom[v1] = { v2, kingdom[v2].num + kingdom[v1].num };
- }
- int main()
- {
- cin >> n >> m;
- for (int i = 0; i < n; i++)kingdom.push_back({ i,1 }); // указываем каждую вершину в правители саму для себя
- for (int i = 0; i < m; i++) {
- int x, y, z;
- cin >> x >> y >> z;
- edges.push_back({ z,x-1,y-1 }); //-1, так как нумерация в программе идёт с '0', а во входных данных зачастую с '1'
- }
- sort(edges.begin(),edges.end(),cmp); // сортируем рёбра в порядке неубывания
- for (int i = 0; i < m; i++) {
- int v1 = find_king(edges[i].v1); // находим короля первой вершины
- int v2 = find_king(edges[i].v2); // короля второй
- int w = edges[i].w;
- if (v1 != v2) { // если король разный - объединяем
- sum += w;
- cout << v1 << ' ' << v2 << ' ' << w << '\n';
- unite(v1, v2);
- }
- }
- cout << sum;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement