POJレポートトライ互いに素セットオイラーパスを解い2513本のカラースティック

POJレポートを解い2513本のカラースティック

問題解決のアイデア:結論オイラーパス、私たちは、それぞれの学位の色ならば、度をカウントする必要があるとだけは奇数である3つ以上の奇数を持って、それは統計の度合いをどうするか、その後、不可能です?色の文字列、1度の色の終わりに達した場合、辞書ツリーを確立します。上記の条件での判定後の次のステップは、どのようにそれは一つに接続することができる木材を決定するには?互いに素・セットでは、トップの色を除いて一番上の優れた色、彼らの集中管理、統計の色であると回数を確認する必要があり、それ自身、他の色の中で最も優れているに等しい、もし不可能である以上、。これは、上記の条件の木製のすべてで接続することができます。
ここに画像を挿入説明

#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 500010;
const int maxn = 1e9;
using namespace std;
struct trie {
	bool flag;//标记字符串是否到达末尾
	int index;
	trie* next[27];
	trie() {
		flag = false;
		index = 0;
		memset(next, 0, sizeof(next));
	}
}root;
int color;
int degree[N];
int ancestor[N];
int find(int x)//寻找x最上级
{
	if (ancestor[x] != x)
		ancestor[x] = find(ancestor[x]);
	return ancestor[x];
}
void union_set(int a, int b)//使a和b的上级相同
{
	int pa = find(a);
	int pb = find(b);
	ancestor[pb] = pa;
	return;
}
int ha(char* s)
{
	trie* p = &root;
	int len = 0;
	while(s[len]!='\0')//建立字典树
	{
		int index = s[len++] - 'a';
		if (!p->next[index])
			p->next[index] = new trie;
		p=p->next[index];
	}
	//循环结束后已到达字符串末尾
	if (p->flag)
		return p->index;
	else
	{
		p->flag = true;
		p->index = ++color;//每一种颜色都有自己的标号
		return p->index;
	}
}
int main()
{
	memset(degree, 0, sizeof(degree));
	color = 0;
	for (int i = 1; i <= N; i++)
	{
		ancestor[i] = i;//一开始并查集中元素的最上级都是自己
	}
	char a[11], b[11];
	while (~scanf("%s %s",&a,&b))
	{
		int i = ha(a);
		int j = ha(b);
		degree[i]++;//统计度数,出入度一起算
		degree[j]++;
		union_set(i, j);
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
	}
	int num = 0;
	int cnt = 0;
	for (int i = 1; i <= color; i++)
	{
		if (degree[i] % 2 == 1)
			num++;
		if (num > 2)
		{
			printf("Impossible\n");
			return 0;
		}
		if (ancestor[i]==i)
		{
			cnt++;
		}
		if (cnt > 1)
		{
			printf("Impossible\n");
			return 0;
		}
	}
	if (num == 1)
		printf("Impossible\n");
	else
		printf("Possible\n");
}



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

おすすめ

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