A. 【例题1】繁忙都市
题目
思路
模板最小生成树,用kruska,将边按权值从小到大排序,然后用并查集判断一边的两端点是否在同一棵树中,如果不在,则将此边加进最小生成树中。
代码
#include<bits/stdc++.h>
using namespace std;
int fa[100001],ans1,ans2,n,m;
struct node
{
int u,v,c;
}a[100001];
bool cmp(node x,node y)
{
return x.c<y.c;
}
int find(int x)//并查集查找
{
if(fa[x]!=x) return fa[x]=find(fa[x]);
return x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].c);
}
for(int i=1;i<=n;++i)
{
fa[i]=i;
}
sort(a+1,a+1+m,cmp);//将边按权值从小到大排序
for(int i=1;i<=m;++i)
{
int x=find(a[i].u),y=find(a[i].v);
if(x!=y)
{
fa[x]=y;//并查集合并
ans2=a[i].c;
}
}
cout<<n-1<<" "<<ans2;
}