Kruskal时间复杂度(mlogm)
算法思路:每次找到最小边如果不在树的集合中就添加进去
#include <iostream> #include <string> #include <cstring> #include <queue> #include <cstdio> #include <algorithm> #define FT(a, b) memset(a, b, sizeof(a)) using namespace std; const int M = 2e5 + 10; int n, m, f[M]; struct node { int u, v, w; bool operator<(const node &x) const { return x.w > w; } } e[M]; int find(int x) { if (f[x] != x) f[x] = find(f[x]); return f[x]; } int main() { scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].w); } sort(e, e + m); int cnt = 0, ans = 0; for (int i = 1; i <= n; i++) f[i] = i; for (int i = 0; i < m; i++) { int u = e[i].u, v = e[i].v, w = e[i].w; int fu = find(u), fv = find(v); if (fu != fv) { f[fu] = fv; cnt++; ans += w; } } if (cnt < n - 1) puts("impossible"); else printf("%d\n", ans); }