互いに素セットの迷路解くHDU 1272レポート少し希望

迷路レポートを解決するためのHDU 1272リトル希望

問題解決のアイデア:このタイトルは難しくありませんが、地元のピットがあります。リテラルは、等しくない場合は、各入力に2つの数値を比較解くだけ祖先は、それらが等しい場合、リング、即ち、出力NOが存在しなければならない、それを接続する問題を理解します。被験体は、さらに、各ノードは、2つを接続することができることを必要とするので、また、より多くのよりも、それはすなわち2つのルートノードを持つことができない、図林ではありません。その上でここまで考えてください。
ここに画像を挿入説明

#include <stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#pragma warning(disable:4996)
#define mod 1000000007
#define ll unsigned long long
const int N = 100005;
using namespace std;
int father[N], visit[N];
int mx;
int mi;
int flag;
int find(int x)
{
	if (father[x] == x)
		return x;
	return father[x] = find(father[x]);
}
void judge()
{
	int cnt = 0;
	for (int i = mi; i <= mx; i++)
	{
		if (visit[i] && i == find(i))//不能有两个根节点
		{
			cnt++;
			if (cnt > 1)
			{
				flag = 1;
				return;
			}
		}
	}
}
int main()
{
	int a, b;
	for (int i = 1; i < N; i++)
	{
		father[i] = i;
	}
	mi = 1000010;
	while (scanf("%d%d", &a, &b))
	{

		if (a == -1 && b == -1)
		{
			return 0;
		}
		if (a == 0 && b == 0)
		{
			judge();
			if (flag)
			{
				printf("No\n");
			}
			else
			{
				printf("Yes\n");
			}
			for (int i = 1; i < N; i++)
			{
				father[i] = i;
			}
			memset(visit, 0, sizeof(visit));
			flag = 0;
			mx = 0;
			mi = 1000010;
			continue;
		}
		mx = max(mx, max(a, b));
		mi = min(mi, min(a, b));
		visit[a] = 1;
		visit[b] = 1;
		if (flag)
		{
			continue;
		}
		int fa = find(a);
		int fb = find(b);
		if (fa == fb)
		{
			flag = true;
			continue;
		}
		else
		{
			father[fa] = fb;
		}
	}
}

公開された64元の記事 ウォンの賞賛0 ビュー1440

おすすめ

転載: blog.csdn.net/weixin_45566331/article/details/105041423