洛谷 P1111 修复公路 并查集

当两个村庄不能相互到达时(即不在同一个集合中),把他们合并进同一个集合,联通块数-1

当n个顶点的联通块数为1时,即连了n-1条边时,这n个顶点能相互到达

#include<iostream>
#include<algorithm>
using namespace std;
int par[1005],rank[1005];
int n,m,x,y,t;
struct pp
{
    int x,y,t;
}a[100005];
bool cmp(pp a,pp b){return a.t<b.t;
}
void init(int n)
{
    for(int i=1;i<=n;i++)
    {
        par[i]=i;
        rank[i]=0;
    } 
}
int find(int x){
    if(par[x]==x)return x;
    return par[x]=find(par[x]);
}
void unite(int x,int y)
{
    x=find(x);y=find(y);
    if(rank[x]<rank[y])par[x]=y;
    else{
        par[y]=x;
        if(rank[x]==rank[y])rank[x]++;
    }
}
bool same(int x,int y){return find(x)==find(y);
}
void solve()
{
    int i;
    cin>>n>>m;
    init(n);
    for(i=1;i<=m;i++)
        cin>>a[i].x>>a[i].y>>a[i].t;
    sort(a+1,a+1+m,cmp);
    for(i=1;i<=m;i++)
    {
        if(!same(a[i].x,a[i].y)){unite(a[i].x,a[i].y);n--;}
        if(n==1){cout<<a[i].t<<endl;return;} 
    }
    cout<<"-1\n";
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/9992643.html