codevs 1638_洛谷 1111_修复公路_并查集

来源:互联网 发布:防止微信屏蔽分享域名 编辑:程序博客网 时间:2024/05/01 01:10

题目大意

给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)


思路

就是一个并查集,然后将时间从小到大排序,每次取最小的合并,如果可以合并就判断减少一个集合,最后只剩一个集合时输出时间


#include <stdio.h>#include <algorithm>using namespace std;struct arr{    int x,y,t;};arr a[1000000];int f[1000000];int find(int x){    if (!f[x]) return x;    f[x]=find(f[x]);    return f[x];}int insert(int x,int y){    if (find(x)!=find(y))    {        f[find(x)]=find(y);        return 1;    }    return 0;}int cam(arr a,arr b){    return a.t<b.t;}int main(){    int n,m;    scanf("%d%d",&n,&m);    for (int i=1;i<=m;i++)        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);    sort(a+1,a+m+1,cam);    int t=n,xx=0;    for (int i=1;i<=m;i++)    {        if (find(a[i].x)!=find(a[i].y))        {            insert(a[i].x,a[i].y);            t--;        }        if (t==1)        {            printf("%d\n",a[i].t);            xx=1;            break;        }    }    if (xx==0) printf("-1\n");}
1 0