2021“MINIEYE杯”中国大学生算法设计超级联赛 6958. KD-Graph
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021“MINIEYE杯”中国大学生算法设计超级联赛 6958. KD-Graph相关的知识,希望对你有一定的参考价值。
Ⅰ.同组点,必存在路径的最大值<=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的主要内容,如果未能解决你的问题,请参考以下文章