[luogu 1111] 修复公路{kruskal最小生成树}

版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82024570

题目

https://www.luogu.org/problemnew/show/P1111


解题思路

本题是一道十分正经的 K r u s k a l 算法,只需要将累加路径总和改为求 m a x 即可,然后需要判断是否全部连通。


代码

#include<cstdio>
#include<algorithm>
using namespace std; 
struct node{int x,y,w;}a[200011];
int ans,nu,head[100010],n,m,f[100010];
bool cmp(node x,node y){return x.w<y.w;}
int findd(int k) {return f[k]==k?f[k]:f[k]=findd(f[k]);}
int main()
{
    scanf("%d%d",&n,&m); 
    for (int i=1;i<=m;i++) 
       scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
    for (int i=1;i<=n;i++) f[i]=i; 
    sort(a+1,a+m+1,cmp); 
    for (int i=1;i<=m;i++){
        int _x=findd(a[i].x),_y=findd(a[i].y);
        if (_x!=_y){ f[_x]=f[_y]; ans=max(ans,a[i].w); nu++; }
    }
    if (nu==(n-1)) printf("%d",ans); else printf("-1"); 
}

猜你喜欢

转载自blog.csdn.net/qq_39897867/article/details/82024570