
思路:这道题就是最小生成树的模板题,直接用最小生成树做就行了
#include <iostream>
#include<algorithm>
using namespace std;
const int N=500100;
struct Edge
{
int u,v,w;
bool operator<(const Edge &a)const
{
return w<a.w;
}
}edge[N];
int pre[N];
void init (int n)
{
for(int i=0;i<n;i++)
pre[i]=i;
}
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
while(x!=r)
{
int i=pre[x];
pre[x]=r;
x=i;
}
return r;
}
bool join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
return true;
}
return false;
}
int main()
{
int n,m,root;
cin>>n>>m>>root;
for(int i=0;i<m;i++)
cin>>edge[i].u>>edge[i].v>>edge[i].w;
sort(edge,edge+m);
int ans=0,num=0;
init(n);
for(int i=0;i<m;i++)
{
if(join(edge[i].u,edge[i].v))
{
ans=edge[i].w;
if(++num==n-1)
break;
}
}
cout<<ans;
return 0;
}
本文深入探讨了最小生成树算法的实现,通过具体代码示例展示了如何使用该算法解决特定问题。文章首先介绍了最小生成树的基本概念,随后详细解释了算法的每一个步骤,包括初始化、查找、连接操作等,最后通过一个完整的C++代码示例,演示了如何应用最小生成树算法求解问题。
4570

被折叠的 条评论
为什么被折叠?



