题目传送门:https://www.luogu.com.cn/problem/P2307
题目思路:
1. 判断是否有环,如果有环,则不符合条件
2. 如果没有环,判断图是否是连通图,
3. 如果不是连通图,则不符合条件,否则符合条件。
总结:
1. 符合条件的情况:无环且为连通图。
2. 不符合条件的情况:有环或者不是连通图。
判断方式:
1. 判断是否存在环使用并查集。2. 判断是不是连通图也使用并查集。
判断是否存在环:
当向并查集中加入边时,如果边的两端点U和V的祖先已经相同,说明存在环。
判断是否为连通图:
如果存在超过2个点,他们的祖先都是自己,则不是连通图。
#include
#include
#include
using namespace std;
const int MAXN = 100005;
struct Edge{
int u,v;
Edge(int u,int v){
this->u = u;
this->v = v;
}
};
vector edges;
bool vis[MAXN];
int father[MAXN];
void initFather(int n){
for(int i=0;i<=n;i++){
father[i] = i;
}
}
int findFather(int x){
int z= x;
while(x != father[x]){
x = father[x];
}
int temp;
while(z != father[z]){
temp = z;
z = father[z];
father[temp] = x;
}
return x;
}
bool unionFather(int x,int y){
int fx = findFather(x);
int fy = findFather(y);
if(fx != fy){
father[fy] = fx;
return false;
}
return true;
}
int judge(int n){
initFather(n);
//判断是否有环
for(int i=0;i>u>>v){
if(u == -1 && v == -1){
break;
}
if(u == 0 && v ==0 ){
cout<