題解 CF1081D 【Maximum Distance】
阿新 • • 發佈:2020-08-08
是一道最小生成樹的題目。
用的是 \(kruskal\) 。
其他不多說,就講一下為什麼最後輸出 \(ans\) \(k\) 次。
假設一個點到另一個點的最大值比現在小,那麼其他的點也會走這條路。
所以上程式碼。
#include<bits/stdc++.h> #define FOR(i,j,k) for(int i=(j);i<=(k);i++) using namespace std; int n,m,k,cnt; int ans; bool s[100001]; int f[100001]; struct point{ int a,b,val; }p[200001]; inline int read() { int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } inline bool cmp(point x,point y) { return x.val<y.val; } int find(int x) { if(f[x]==x) return x; f[x]=find(f[x]); return f[x]; } int main() { n=read(),m=read(),k=read(); int x; for(int i=1;i<=n;i++) f[i]=i; for(int i=1;i<=k;i++) x=read(),s[x]=true; for(int i=1;i<=m;i++) { int u=read(),v=read(),w=read(); p[++cnt].a=u,p[cnt].b=v,p[cnt].val=w; } sort(p+1,p+1+cnt,cmp); for(int i=1;i<=cnt;i++) { int fa=find(p[i].a),fb=find(p[i].b); if(fa!=fb) { if(s[fa]&&s[fb]) ans=max(ans,p[i].val); if(s[fa]||s[fb]) s[fa]=s[fb]=1; f[fa]=fb; } } for(int i=1;i<=k;i++) printf("%d ",ans); return 0; }