标签:一个点 题目 int 题解 Maximum 条路 ans CF1081D
是一道最小生成树的题目。
用的是 \(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;
}
标签:一个点,题目,int,题解,Maximum,条路,ans,CF1081D 来源: https://www.cnblogs.com/LJC001151/p/13460397.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。