洛谷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;
}
posted @ 2020-08-03 10:46  panjx  阅读(223)  评论(0编辑  收藏  举报