2021“MINIEYE杯”中国大学生算法设计超级联赛 6958. KD-Graph

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021“MINIEYE杯”中国大学生算法设计超级联赛 6958. KD-Graph相关的知识,希望对你有一定的参考价值。

LINK

Ⅰ.同组点,必存在路径的最大值<=D

等价于只保留<=D的边两点仍然连通,就可以作为同组点

Ⅱ.不同组点,任何路径的最大值>D

等价于只保留<=D的边若两点连通,就不能作为不同组点

所以只需要把<=D的边加进去,若两点连通则必属于同一组,最后看一下有多少组即可

显然可以二分D,随着D的增大分组组数减小

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5+10;
int n,m,k,fa[maxn],l[maxn],r[maxn],c[maxn];
int find(int x){ return x==fa[x]?x:fa[x]=find( fa[x] ); }
void join(int q,int w){ fa[find(q)] = find(w); }
int get(int x)
{
	for(int i=1;i<=n;i++)	fa[i] = i;
	for(int i=1;i<=m;i++)
		if( c[i]<=x )	join( l[i],r[i] );
	int ans = 0;
	for(int i=1;i<=n;i++)
		if( i==find(i) )	ans++;
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
	int t; cin >> t;
	while( t-- )
	{
		cin >> n >> m >> k;
		for(int i=1;i<=m;i++)	cin >> l[i] >> r[i] >> c[i];
		int L = 0, R = 1e9, ans = 1e9+1;
		while( R>=L )
		{
			int mid = L+R>>1;
			int x = get(mid);
			if( x<=k )	R = mid-1;
			else	L = mid+1;
			if( x==k )	ans = min( ans,mid );
		}
		if( ans==1e9+1 )	ans = -1;
		cout << ans << endl;
	}
}

以上是关于2021“MINIEYE杯”中国大学生算法设计超级联赛 6958. KD-Graph的主要内容,如果未能解决你的问题,请参考以下文章

2021“MINIEYE杯”中国大学生算法设计超级联赛补题

2021“MINIEYE杯”中国大学生算法设计超级联赛题解

2021杭电多校赛2021“MINIEYE杯”中国大学生算法设计超级联赛签到题3题

2021“MINIEYE杯”中国大学生算法设计超级联赛

2021“MINIEYE杯”中国大学生算法设计超级联赛题解

6983 杭电多校(2021“MINIEYE杯”中国大学生算法设计超级联赛3) [记忆化搜索]