☞洛谷P1111 修复公路☜
光棍题。。。
大意
有n个村庄,m条道路,每个道路修复需要在第ti天才能修好(几条道路可以同时施工),问最少要几天这张图才能联通,如果一直都联通不了输出-1。
思路
并查集+排序(sort)
代码
#include<bits/stdc++.h>
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;int n,m,f[1001],ans,low,now,j,maxn;
struct node{
int u,v,t;
}a[100001];//结构体1
struct BCJ{//并查集结构体
void start(int x)//初始化
{r(i,1,x) f[i]=i;}
int find(int x)//查找
{return x==f[x]?x:f[x]=find(f[x]);}
void judge(int a,int b)//合并
{f[find(a)]=find(b);}
bool too(int a,int b)//询问
{return find(a)==find(b);}
}acs;
bool cmp(node x,node y)
{
return x.t<y.t;//排序,按时间
}
int main()
{
scanf("%d %d",&n,&m);acs.start(n);
r(i,1,m)
{scanf("%d %d %d",&a[i].u,&a[i].v,&a[i].t);maxn=max(a[i].t,maxn);}//取最大值
low=1;sort(a+1,a+1+m,cmp);now=n;//排序
r(i,1,maxn)
{
for(j=low;a[j].t<=i&&j<=m;j++)
{if(!acs.too(a[j].u,a[j].v))now--;acs.judge(a[j].u,a[j].v);}//判断并合并,同时now--
low=j;
if(now==1) {printf("%d",i);return 0;}//直到联通为止
}
puts("-1");//永远无法联通
}