并查集+欧拉回路+字典树 Colored Sticks POJ 2513

输入多组数据,每组数据两种颜色,表示一根木头两端的颜色,现在要将这些木头相连,要求相连部分颜色相同,问能否全部连通

提示

1)一个要判断所有的木头是否在一个集合中,即是否能相连

2)判断一种颜色出现的数量

3)一棵树如果只有0或2个点出现次数为奇数,则树可以一笔画成

#include <stdio.h>
#include <string.h>
#define maxn 500005
int tot;
int f[maxn];
int num[maxn];
struct trie
{
	trie *next[30];
	int id;
	trie()
	{
		for(int i=0;i<30;i++)
			next[i]=NULL;
		id=0;
	}
};
trie *root;
int find(int i)
{
	if(i==f[i])
		return f[i];
	f[i]=find(f[i]);
	return f[i];
}
int build(char *str)           //建立字典树
{
	int len=strlen(str);
	trie *p=root;
	for(int i=0;i<len;i++)
	{
		int id=str[i]-'a';
		if(p->next[id]==NULL)
			p->next[id]=new trie;
		p=p->next[id];
	}
	if(p->id==0)
		p->id=tot++;
	return p->id;
}
int main()
{
	char str1[50];
	char str2[50];
	int a,b;
	int fr,ed;
	int i;
	for(i=0;i<maxn;i++)
	{
		f[i]=i;
		num[i]=0;
	}
	tot=1;
	int tt=0,ff=0;
	root=new trie;
	while(scanf("%s%s",str1,str2)!=-1)
	{
		a=build(str1);
		b=build(str2);
		fr=find(a);
		ed=find(b);
		if(fr!=ed)
			f[fr]=ed;  //集合
		num[a]++;         //统计出现次数
		num[b]++;
	}
	for(i=1;i<tot;i++)
		if(num[i]%2==1)
			tt++;
	for(i=1;i<tot;i++)
		if(f[i]==i)
			ff++;
	if(((tt==0)||(tt==2))&&(ff==1||ff==0))
		printf("Possible\n");
	else
		printf("Impossible\n");
	return 0;
}

并查集+欧拉回路+字典树 Colored Sticks POJ 2513

时间: 2024-12-23 23:31:15

并查集+欧拉回路+字典树 Colored Sticks POJ 2513的相关文章

poj2513——判断是否为欧拉图(并查集,trie树)

POJ 2513    Colored Sticks 欧拉回路判定,并查集,trie树 Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 31621   Accepted: 8370 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possibl

Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水

Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction   思维,并查集 或 线段树 题意:一个字符串被删除了,但给出 n条信息,要还原出可能的字典序最小的字符串.信息有:字符串ti,ki个位置xi,表明原本的字符串在xi位置是以字符串ti开头的. tags:惨遭 fst,一开始把所有字符串都存下来,排序做的,结果爆内存了.. 方法1: 考虑并查集,对于字符串 ti,在位置xi,

HDU 1512 并查集+左偏树

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3105    Accepted Submission(s): 1330 Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they e

字典树模板题 POJ 2503

1 #include <cstdio> 2 #include <cstring> 3 4 char en[11],fr[11]; 5 int st; 6 struct Tire{ 7 int next[26]; 8 char eng[11]; 9 }node[200005]; 10 void insert(char *s,int cur) 11 { 12 if(*s){ 13 if(!node[cur].next[*s-'a']) 14 node[cur].next[*s-'a']

POJ2513 【并查集+欧拉路径+trie树】

题目链接:http://poj.org/problem?id=2513 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions:40949   Accepted: 10611 Description You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it

ACM学习历程—SNNUOJ 1110 传输网络((并查集 &amp;&amp; 离线) || (线段树 &amp;&amp; 时间戳))(2015陕西省大学生程序设计竞赛D题)

Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的.现在他们开始在其他城市陆 续建立了新的基站,命令“C x“代表在城市x建立了一个新的基站,不会在同一个城市建立多个基站:城市编号为1到n,其中城市1就是首都Bytetown.在建立基站的过程中他们还 会询问某个城市的网络信号是从哪个城市传输过来的,命令”Q x“代表查询城市x的来源城市. Inpu

HDU 1878 欧拉回路 (并查集+欧拉回路)

题目地址:HDU 1878 这个题要注意欧拉回路与欧拉通路的区别.在都保证连通性的前提下,欧拉回路要求每个点的度数都是偶数,而欧拉通路允许两个点的度数是奇数.所以这题用并查集判断连通性后判断下度数就可以了. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib

经典模型——并查集解决区间/树链染色问题

蒟蒻的第一篇blog 模型背景: 已知一个长度为n的序列,开始时序列的每一个元素都没有颜色(0),现进行m次操作,第i次操作将一段区间[l,r]中还未被染色的点(即a[i]=0的点)染成颜色i.问m次操作后这个区间长什么样子,并将它输出来. 数据规模约定:对于100%的数据,n,m<=10^6 问题解决 我会nm暴力! 对于每一个操作i,暴力扫描[l,r],染色,最后输出. ※期望得分:10. 并查集!没想到吧 用并查集来维护从节点i往后的区间[i,n]中第一个0出现的位置,也就是i之后第一个还

Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】

题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点x所在树的直径. (2)2 x y: 如果x,y不在同一棵树上的话,用一条边连接x,y所在的树,并且使得到的新树的直径尽可能小. 题解: 首先对于初始状态,算出每一棵树的直径d[find(i)]. 每次合并树的时候,因为要尽可能让新树直径变小,所以显然这条边要分别连接两棵树直径的“中点”. 所以新树