HDU1325 &&poj1308 基础并查集
和上一道小希的迷宫差点儿相同,可是在HDU上提交一直WA,POJ过了
HDU的数据太强了吧,强的我感觉数据有问题
题意:输入若干对点,推断是否是一颗树,转化过来也就是是否存在环
点数-边数=1,还要推断每一个点的入度都<=1
POJ AC代码
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int INF = 1e8;
using namespace std;
int father[1010];
bool vis[1010];
int rudu[1010];
int findx(int r)
{
int i = r,j;
while(father[r]!=r)
{
r=father[r];
}
while(father[i]!=r)
{
j = father[i];
father[i] = r;
i = j;
}
return r;
}
bool Merge(int x,int y)
{
int fx,fy;
fx=findx(x);
fy=findx(y);
if(fx!=fy)
{
father[fx]=fy;
return 1;
}
else
return 0;
}
void init()
{
for(int i=0;i<1010;i++)
{
father[i]=i;
vis[i] = 0 ;
rudu[i] = 0;
}
}
int main()
{
int a,b,c = 0;
while(scanf("%d%d",&a,&b)!=EOF)
{
c++;
if(a<0&&b<0)
break;
int flag=1,t=0;
if(a==0 && b==0)
{
printf("Case %d ",c);
puts("is a tree.");
continue;
}
init();
int num = 0;
while(1)
{
if(a==0&&b==0) break;
if(flag==1)
{
if(!vis[a]) {num++; }
if(!vis[b]) {num++; rudu[b]++;}
if(rudu[b]>1)
flag = 0;
vis[a]=1; vis[b]=1;
if(Merge(a,b)==1)
{
t++;
}
else
flag = 0;
}
scanf("%d%d",&a,&b);
}
printf("Case %d ",c);
if(num-t==1 &&flag == 1)
puts("is a tree.");
else
puts("is not a tree.");
}
return 0;
}

浙公网安备 33010602011771号