洛谷P1547 [USACO05MAR]Out of Hay S
0、链接
洛谷P1547 [USACO05MAR]Out of Hay S
1、题意:
求一个图上最小生成树的最长边。
\(2≤\) 点数 \(≤\) \(2*10^3\)
\(1≤\) 边数 \(≤\) \(10^4\)
边权总长\(≤\) \(10^9\)
2、思路
数据规模很小,无论怎么写乱搞哪种最小生成树模板都可以过。
这里采用kruscal算法,模板只要将累加改为求最大值即可。
代码给注释:
3、code:
#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
const int M = 10005;
int maxn = -0x3f3f3f3f;
int n, m, fa[N];
struct node{
int x, y, z;
}a[M];
bool cmp(node xx,node yy)
{
return xx.z < yy.z;
}
int find(int xx)
{
return fa[xx] == xx ? xx : fa[xx] = find(fa[xx]); // 并查集
}
void merge(int xx, int yy) //合并两个集合
{
int xxx = find(xx);
int yyy = find(yy);//先find完再判断
if(xxx != yyy)
{
fa[yyy] = xxx;//这里为find结束的东西
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
cin >> a[i].x >> a[i].y >> a[i].z;
}
for(int i = 1; i <= n; i++)
{
fa[i] = i;
}
sort(a + 1, a + m + 1, cmp);// 此处为m
for(int i = 1; i <= m; i++)
{
if(find(a[i].x) != find(a[i].y))
{
merge(a[i].x, a[i].y);
maxn = max(maxn, a[i].z);//这里是取max
}
}
cout << maxn;
return 0;
}