题目链接:hdu 1272
大概题意:并查集简单运用,用点数 - 边数 == 1 判断是否有环
代码:
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 100010
int cnt;
int node[maxn];
int vis[maxn];
int F[maxn];
int find(int x)
{
if(F[x] == -1) return x;
return F[x] = find(F[x]);
}
void bing(int x, int y)
{
int p1 = find(x);
int p2 = find(y);
if(p1 != p2) F[p1] = p2;
}
int main()
{
int a, b;
bool end = false;
while(true){
cnt = 0;
int edge_num = 0;
memset(vis, 0, sizeof(vis));
memset(F, -1, sizeof(F));
while(true){
scanf("%d%d", &a, &b);
if(a == -1 && b == -1){
end = true;
break;
}
if(a == 0 && b == 0) break;
if(vis[a] == false){
vis[a] = true;
node[cnt] = a; cnt++;
}
if(vis[b] == false){
vis[b] = true;
node[cnt] = b; cnt++;
}
edge_num++;
bing(a, b);
}
if(end) break;
int rt = find(node[0]);
bool yeah = true;
for(int i = 1; i < cnt; i++){
int v = node[i];
if(find(v) != rt) {
yeah = false; break;
}
}
if(yeah && cnt - edge_num == 1)
printf("Yes\n");
else if(yeah && cnt == 0)
printf("Yes\n");
else printf("No\n");
}
return 0;
}