Codeforces - Maximum Distance

题目链接:Codeforces - Maximum Distance


显然就是把k个特殊点连接在一起的最小边的最大值。

所以明显的MST,但是我们怎么快速判断当前k个点已经两两可达了呢?我们维护一个sz即可,这个就是表示当前是否有k个点中的点在其中。然后这种一共连接k-1次。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m,k,f[N],sz[N],res,cnt,vis[N],x[N];
struct node{int u,v,w;}t[N];
int cmp(node a,node b){return a.w<b.w;}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
signed main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++)	f[i]=i;
	for(int i=1;i<=k;i++)	scanf("%d",&x[i]),sz[x[i]]=1;
	for(int i=1;i<=m;i++)	scanf("%d %d %d",&t[i].u,&t[i].v,&t[i].w);
	sort(t+1,t+1+m,cmp);
	for(int i=1;i<=m;i++){
		int x=find(t[i].u),y=find(t[i].v);
		if(x==y)	continue;
		if(sz[x]&&sz[y])	cnt++;
		f[x]=y; sz[y]+=sz[x]; res=max(res,t[i].w);
		if(cnt==k-1)	break;
	}
	for(int i=1;i<=k;i++)	printf("%d ",res);
	return 0;
}
发布了809 篇原创文章 · 获赞 246 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/105286106