P1111 修复公路 题解
这道题就是并查集的练手好题QAQ
如果对并查集不熟悉的同学可以做一下这道题
来看一下题目:
给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
我们可以将这N个村庄看成N个点,其中M是我们要合并的次数。
很明显,修路时间t越早的就要越早合并,所以要先排序!(样例中都能看出来)
排序后,按照时间逐个合并,如果合并过程中道路连通,那么输出时间;否则输出-1
但是如果按时间排序,x,y也要跟着动,怎么办呢?用结构体!结构体不会的可以自行离开了
如何判断当前N个点有没有在一个集合内呢?
我们设fa[i]是第i个人的祖先,初始化fa[i]=i,各自是各自的祖先
当合并一次之后,我们扫一遍fa数组,统计fa[i]=i的个数:
- 如果只有1个fa[i]=i,就说明所有的全部联通了(因为只有1个人是自己的祖先,别的人都跟着他)
- 如果不止1个,就说明当前没有全部联通(因为两个人互相没有关系),需要继续合并。
时间复杂度可能会有点高,但足够通过本题了。
上代码:
#include
using namespace std;
int fa[1000+10],n,m;
struct node
{
int x,y,t;
}a[100000+10];//结构体大法好!
bool cmp(node fir,node sec)
{
return fir.t=2),输出-1
return 0;//愉快的结束主程序
}