要想富先修路 (并查集)

来源:互联网 发布:淘宝销量技巧 编辑:程序博客网 时间:2024/06/05 08:58

Description

习大大说过“要想富,先修路”,我们国家的公路建设正是在践行这句名言。假设某镇一共有N个村庄,政府决定在这些村庄之间建设M条公路。第i条公路连接着两个村庄,ui和vi,并会在第ti个月建设完成。镇长希望聪明的你能告诉他,最早什么时候任意两个村庄都能通车,即任意两个村庄间都存在一条建设完成的道路(可由多条公路连接而成)。

Input

输入第一行包括两个整数N,M( 2 <= N <= 100 ) ( 2 <= M <= 1000 )。 
接下来M行,每行3个整数ui,vi,ti( 1 <= ti <= 10000 ),分别表示这条道路连接的村庄和建设完成时间。 

Output

输出一个整数,表示最早在第几个月任意两个村庄都能通车。如果所有道路建完后都还不能满足条件,则输出一个数-1。

Sample Input

4 41 2 61 3 41 4 54 2 3

Sample Output

5


思路:
加权并查集,先按连通时间从小到大排序,然后挨个连通.
开始时,所有城市均未连通。有N个独立的集合.

每合并一次,集合数-1.当所有城市连通时,应只有一个集合.


#include <cstdio>#include <algorithm>using namespace std;#define max(a,b) (((a)>(b))?(a):(b))int f[1005];int N,M;struct _st{int x;int y;int time;}st[1005];bool cmp(_st a,_st b){return a.time < b.time;}void init() //初始{int i;for(i=1;i<=M;i++){f[i]=i;}}int find(int a){if(f[a]==a) return f[a];elsef[a]=find(f[a]); //路径压缩return f[a];}int main(){int t1,t2,ma=-1,sum,i;scanf("%d %d",&N,&M);        sum=N;for(i=0;i<M;i++){scanf("%d%d%d",&st[i].x,&st[i].y,&st[i].time);}sort(st,st+M,cmp);init();for(i=0;i<M;i++){t1=find(st[i].x); t2=find(st[i].y);if(t1 !=t2){f[t2]=t1;sum--;ma=max(ma,st[i].time);}if(sum==1)break;}if(sum==1)printf("%d\n",ma);elseprintf("-1\n");return 0;}