POJ 1308 Is It A Tree? 解题报告
解题思路:跟箭头的有向无向没有关系,直接用并查集确定根是否相同就行,只是需要注意下不能形成森林(有复数根)
#include <stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#include<cmath>
#pragma warning(disable:4996)
#define mod 1000000007
#define ll unsigned long long
const int maxn = 1000005;
using namespace std;
int father[maxn];
int visit[maxn];
int find(int x)
{
if(x != father[x])
{
father[x] = find(father[x]);
}
return father[x];
}
int main()
{
for (int i = 0; i < maxn; i++)
{
father[i] = i;
}
int a, b,cnt=1,flag=0;
while (~scanf("%d%d",&a,&b))
{
if (a == 0 && b == 0)
{
int tem = 0;
for (int i = 0; i <= maxn; i++)
{
if (visit[i] && i == father[i])
{
tem++;
if (tem > 1)
{
flag = 1;
break;
}
}
}
if (flag)
{
printf("Case %d is not a tree.\n", cnt);
}
else
{
printf("Case %d is a tree.\n", cnt);
}
cnt++;
for (int i = 0; i < maxn; i++)
{
father[i] = i;
}
memset(visit, 0, sizeof(visit));
flag = 0;
}
else if (a == -1 && b == -1)
{
break;
}
else
{
if (flag)
continue;
visit[a] = visit[b] = 1;
int fa = find(a);
int fb = find(b);
if (fa == fb)
{
flag = 1;
continue;
}
else
{
father[fb] = fa;
}
}
}
}