CCF201812-4 数据中心(100分)Kruskal算法
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCF201812-4 数据中心(100分)Kruskal算法相关的知识,希望对你有一定的参考价值。
试题编号: 201812-4
试题名称: 数据中心
时间限制: 1.0s
内存限制: 512.0MB
样例输入
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
样例输出
4
样例说明
下图是样例说明。
问题链接:CCF201812-4 数据中心
问题简述:求最小生成树的最大权边。
问题分析:用Kruskal算法来实现,并查集是必要的,套用一下并查集的模板就好了。
程序说明:(略)
参考链接:(略)
题记:模板是重要的,套模板程序就简单了。
100分的C++语言程序如下:
/* CCF201812-4 数据中心 */
#include <bits/stdc++.h>
using namespace std;
/* 并查集 */
const int N = 50000;
int f[N + 1], fcnt;
void UFInit(int n) {for(int i = 0; i <= n; i++) f[i] = i; fcnt = n;}
int Find(int a) {return a == f[a] ? a : f[a] = Find(f[a]);}
int Union(int a, int b) {if ((a = Find(a)) != (b = Find(b))) {f[a] = b, fcnt--; return 1;} else return 0;}
const int M = 100000;
struct Edge {
int u, v, w;
} e[M];
bool cmp(Edge a, Edge b)
{
return a.w < b.w;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
cout.tie(NULL);
/* 读入数据 */
int n, m, root;
cin >> n >> m >> root;
for (int i = 0; i < m; i++)
cin >> e[i].u >> e[i].v >> e[i].w;
/* 初始化并查集 */
UFInit(n);
/* Kruskal算法 */
sort(e, e + m, cmp);
int ans = 0;
for (int i = 0; i < m; i++) {
if (Union(e[i].u, e[i].v))
ans = max(ans, e[i].w);
if (fcnt == 1) break;
}
/* 输出结果 */
cout << ans << endl;
return 0;
}
以上是关于CCF201812-4 数据中心(100分)Kruskal算法的主要内容,如果未能解决你的问题,请参考以下文章