洛谷 P1111 修復公路 並查集
阿新 • • 發佈:2018-11-21
當兩個村莊不能相互到達時(即不在同一個集合中),把他們合併進同一個集合,聯通塊數-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(); }