H 修建道路
最小生成树,模板题。
所有城市两两可达,最少边数为n-1,然后再保留一下加入边的最大权值就行。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=10010;
struct node{
    int u,v,c;
}a[N];
int n,m,ans,fa[N];
bool cmp(node x,node y){return x.c<y.c;}//所有边按权值大到小排序
int find(int x){//并查集查找
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++) scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].c);
    sort(a+1,a+m+1,cmp);    
    for(int i=1,k=0;i<=m;i++){
        int fx=find(a[i].u),fy=find(a[i].v);
        if(fx!=fy){
            fa[fy]=fx;//并查集合并
            ans=max(ans,a[i].c);//更新最大权值
            if(++k==n-1) break;
        }
    }    
    printf("%d %d\n",n-1,ans);
    return 0;
}