POJ 1308であることA木?レポート互いに素セットを解きます

POJ 1308であることA木?問題解決レポート

アイデアを問題解決:(複雑な根がある)がライン上で同じルートかどうかを判断するために無向、直接互いに素・セットへの矢印とは関係はありませんが、次の注意を払うに森林の必要性を形成することはできません
ここに画像を挿入説明

#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