1. 程式人生 > >洛谷 P1111 修復公路 並查集

洛谷 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(); }