[{{mminutes}}:{{sseconds}}] X
Пользователь приглашает вас присоединиться к открытой игре игре с друзьями .
кодМой
(0)       Используют 4 человека

Комментарии

Ни одного комментария.
Написать тут
Описание:
разные алгоритмы
Автор:
RKastor
Создан:
13 декабря 2017 в 13:59 (текущая версия от 13 декабря 2017 в 14:01)
Публичный:
Нет
Тип словаря:
Тексты
Цельные тексты, разделяемые пустой строкой (единственный текст на словарь также допускается).
Информация:
#include <iostream>
#include <cmath>
#include <iomanip>
#include <set>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
const int INF = 1e9 + 7;
int parent[20005];
int rank1[20005];
void make_set (int v) {
parent[v] = v;
rank1[v] = 0;
}
int find_set (int v) {
if (v == parent[v])
return v;
return parent[v] = find_set (parent[v]);
}
void union_sets (int a, int b) {
a = find_set (a);
b = find_set (b);
if (a != b) {
if (rank1[a] < rank1[b])
swap(a, b);
parent[b] = a;
if (rank1[a] == rank1[b])
++rank1[a];
}
}
int main()
{
int n, m, ans = 0;
cin >> n >> m;
set <pair <int, pair <int, int> >> s;
int tmp1, tmp2, tmp3;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &tmp1, &tmp2, &tmp3);
s.insert({tmp3, {tmp1, tmp2});
}
for (int i = 1; i <= n; i++)
make_set(i);
while (s.size() > 0)
{
int v = (s.begin() -> second).first;
int v1 = (s.begin() -> second).second;
int w = s.begin() -> first;
s.erase(*s.begin());
if (find_set(v) != find_set(v1))
{
union_sets(v, v1);
ans += w;
}
}
cout << ans;
}
Содержание:
1 #include <iostream> #include <cmath> #include <iomanip> #include <set> #include <stdio.h> #include <algorithm> #include <vector> using namespace std; const int INF = 1e9 + 7; int parent[20005]; int rank1[20005]; void make_set (int v) { parent[v] = v; rank1[v] = 0; } int find_set (int v) { if (v == parent[v]) return v; return parent[v] = find_set (parent[v]); } void union_sets (int a, int b) { a = find_set (a); b = find_set (b); if (a != b) { if (rank1[a] < rank1[b]) swap(a, b); parent[b] = a; if (rank1[a] == rank1[b]) ++rank1[a]; } } int main() { int n, m, ans = 0; cin >> n >> m; set <pair <int, pair <int, int> >> s; int tmp1, tmp2, tmp3; for (int i = 0; i < m; i++) { scanf("%d%d%d", &tmp1, &tmp2, &tmp3); s.insert({tmp3, {tmp1, tmp2}}); } for (int i = 1; i <= n; i++) make_set(i); while (s.size() > 0) { int v = (s.begin() -> second).first; int v1 = (s.begin() -> second).second; int w = s.begin() -> first; s.erase(*s.begin()); if (find_set(v) != find_set(v1)) { union_sets(v, v1); ans += w; } } cout << ans; }

Связаться
Выделить
Выделите фрагменты страницы, относящиеся к вашему сообщению
Скрыть сведения
Скрыть всю личную информацию
Отмена