→题目链接←
使n个点联通显然的是n-1条边
将边以长度从小到大排序,如果目前的边的两端点不在同一集合中,就选择这个边,这显然是最优的
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct edge{
int s,t,len;
friend bool operator < (edge a,edge b){
return a.len<b.len;
}
}e[10010];
int Max=0;
int n,m;
int fa[303];
int getroot(int x){
if(fa[x]==x)return x;
return fa[x]=getroot(fa[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)fa[i]=i;
for(int i=0; i<m; i++)scanf("%d%d%d",&e[i].s,&e[i].t,&e[i].len);
sort(e,e+m);
for(int i=0; i<m; i++){
int x=getroot(e[i].s);
int y=getroot(e[i].t);
if(x==y)continue;
fa[x]=y;
Max=max(Max,e[i].len);
}
printf("%d %d\n",n-1,Max);
return 0;
}