POJ 1308 Is It A Tree? 解题报告 并查集

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;
			}
		}
	}

}


发布了64 篇原创文章 · 获赞 0 · 访问量 1437

猜你喜欢

转载自blog.csdn.net/weixin_45566331/article/details/105147237
今日推荐