题目链接: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;
}