From ae40ca4f4dbb86ed72cdd7ea5f23532caa5dd42e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Mon, 8 Jan 2024 11:21:20 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing/MinimalSpanningTree/859.cpp | 11 ++-- TangDou/AcWing/MinimalSpanningTree/859.md | 11 ++-- .../T3/MinialSpanningTree/1141_Kruskal.cpp | 64 +++++++++++-------- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/TangDou/AcWing/MinimalSpanningTree/859.cpp b/TangDou/AcWing/MinimalSpanningTree/859.cpp index 94467d6..e5f6057 100644 --- a/TangDou/AcWing/MinimalSpanningTree/859.cpp +++ b/TangDou/AcWing/MinimalSpanningTree/859.cpp @@ -24,7 +24,7 @@ int find(int x) { } // Kruskal算法 -int kruskal() { +void kruskal() { // 1、按边权由小到大排序 sort(edge, edge + m); // 2、并查集初始化 @@ -37,8 +37,7 @@ int kruskal() { p[a] = b, res += c, cnt++; // cnt是指已经连接上边的数量 } // 4、特判是不是不连通 - if (cnt < n - 1) return INF; - return res; + if (cnt < n - 1) res = INF; } int main() { @@ -48,10 +47,10 @@ int main() { cin >> a >> b >> c; edge[i] = {a, b, c}; } - int t = kruskal(); - if (t == INF) + kruskal(); + if (res == INF) puts("impossible"); else - printf("%d\n", t); + printf("%d\n", res); return 0; } \ No newline at end of file diff --git a/TangDou/AcWing/MinimalSpanningTree/859.md b/TangDou/AcWing/MinimalSpanningTree/859.md index 84141df..f802ad9 100644 --- a/TangDou/AcWing/MinimalSpanningTree/859.md +++ b/TangDou/AcWing/MinimalSpanningTree/859.md @@ -122,7 +122,7 @@ int find(int x) { } // Kruskal算法 -int kruskal() { +void kruskal() { // 1、按边权由小到大排序 sort(edge, edge + m); // 2、并查集初始化 @@ -135,8 +135,7 @@ int kruskal() { p[a] = b, res += c, cnt++; // cnt是指已经连接上边的数量 } // 4、特判是不是不连通 - if (cnt < n - 1) return INF; - return res; + if (cnt < n - 1) res = INF; } int main() { @@ -146,11 +145,11 @@ int main() { cin >> a >> b >> c; edge[i] = {a, b, c}; } - int t = kruskal(); - if (t == INF) + kruskal(); + if (res == INF) puts("impossible"); else - printf("%d\n", t); + printf("%d\n", res); return 0; } ``` \ No newline at end of file diff --git a/TangDou/AcWing_TiGao/T3/MinialSpanningTree/1141_Kruskal.cpp b/TangDou/AcWing_TiGao/T3/MinialSpanningTree/1141_Kruskal.cpp index eb79e42..166a5e8 100644 --- a/TangDou/AcWing_TiGao/T3/MinialSpanningTree/1141_Kruskal.cpp +++ b/TangDou/AcWing_TiGao/T3/MinialSpanningTree/1141_Kruskal.cpp @@ -1,44 +1,58 @@ #include using namespace std; const int N = 110, M = 210; -int n, m, fa[N]; +const int INF = 0x3f3f3f3f; -//结构体 -struct Edge { - int a, b, w; - bool operator<(const Edge &t) { - return w < t.w; +int n, m; // n条顶点,m条边 +int res; // 最小生成树的权值和 +int cnt; // 最小生成树的结点数 + +// Kruskal用到的结构体 +struct Node { + int a, b, c; + bool const operator<(const Node &t) const { + return c < t.c; // 边权小的在前 } -} e[M]; +} edge[M]; // 数组长度为是边数 -//并查集 +// 并查集 +int p[N]; int find(int x) { - if (fa[x] != x) fa[x] = find(fa[x]); //路径压缩 - return fa[x]; + if (p[x] != x) p[x] = find(p[x]); + return p[x]; +} + +// Kruskal算法 +int kruskal() { + // 1、按边权由小到大排序 + sort(edge, edge + m); + // 2、并查集初始化 + for (int i = 1; i <= n; i++) p[i] = i; + // 3、迭代m次 + for (int i = 0; i < m; i++) { + int a = edge[i].a, b = edge[i].b, c = edge[i].c; + a = find(a), b = find(b); + if (a != b) + p[a] = b, res += c, cnt++; // cnt是指已经连接上边的数量 + } + // 4、特判是不是不连通 + if (cnt < n - 1) return INF; + return res; } + int main() { cin >> n >> m; - //并查集初始化 - for (int i = 1; i <= n; i++) fa[i] = i; - + int sum = 0; // Kruskal算法直接记录结构体 for (int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; - e[i] = {a, b, c}; + edge[i] = {a, b, c}; + sum += c; } - sort(e, e + m); //不要忘记e数组的长度是边的数量 - int res = 0; - //枚举每条边 - for (int i = 0; i < m; i++) { - int a = find(e[i].a), b = find(e[i].b), c = e[i].w; - if (a != b) - fa[a] = b; - else - res += c; //去掉的边权 - } - printf("%d\n", res); + int t = kruskal(); + printf("%d\n", sum - t); return 0; }