23.03.29 学习
Kruskal = quicksort + 并查集
,并查集真忘了,也不想写重载运算符,就用cmp
比较rule
吧
复习一下并查集
6600/52000,一道题提交前进200,把图论补完恐怕进不去前6000,还是要补完数论ToT
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10, INF = 0x3f3f3f3f;
int n, m;
int p[N];
struct Edge {
int a, b, w;
}edges[M];
static bool cmp(Edge& a, Edge& b) {
return a.w < b.w;
}
int find(int x) {
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int kruskal() {
sort(edges, edges + m, cmp);
for (int i = 1; i <= n; i ++ ) p[i] = i;
int sum = 0, cnt = 0;
for (int i = 0; i < m; i ++ ) {
int a = edges[i].a, b = edges[i].b, w = edges[i].w;
if (find(a) != find(b)) {
p[find(a)] = find(b);
cnt ++ ;
sum += w;
}
}
if (cnt != n - 1) return INF;
else return sum;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; i ++ ) {
int a, b, w;
cin >> a >> b >> w;
edges[i] = {a, b, w};
}
int res = kruskal();
if (res == INF) cout << "impossible" << endl;
else cout << res << endl;
return 0;
}