Colored Sticks
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 256000/128000K (Java/Other)
Total Submission(s) : 1 Accepted Submission(s) : 1
Problem Description
You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line such that the colors of the endpoints that touch are of the same color?
Input
Input is a sequence of lines, each line contains two words, separated by spaces, giving the colors of the endpoints of one stick. A word is a sequence of lowercase letters no longer than 10 characters. There is no more than 250000 sticks.
Output
If the sticks can be aligned in the desired way, output a single line saying Possible, otherwise output Impossible.
Sample Input
blue red
red violet
cyan blue
blue magenta
magenta cyan
Sample Output
题目大意:给你很多对单词,单词相当于一个点,一对单词相当于一条边,问这么多对的单词能否组成一条欧拉路,要求每条边都要经过。题目数据很大,每个单词最多10个字母,之前用map映射,把字母映射成编号,但是速度太慢,一直TLE,后来换成字典树,字典树速度才行,连通性就用并查集,判断欧拉路是否组成,就看度数是奇数的个数是否是0或者2。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <map>
using namespace std;
struct node
{
int x;
node *next[26];
};
int deg[510005], father[510005], cnt, ant;
node *root, memory[5100050];
node *create()
{
node *p = &memory[ant++];
int i;
for(i = 0; i < 26; i++)
{
p->next[i] = NULL;
}
return p;
};
void insert(char *s, int x)
{
node *p = root;
int i, k;
for(i = 0; s[i]; i++)
{
k = s[i] - 'a';
if(p->next[k] == NULL)
{
p->next[k] = create();
}
p = p->next[k];
}
p->x = x;
}
int search(char *s)
{
node *p = root;
int i, k;
for(i = 0; s[i]; i++)
{
k = s[i] - 'a';
if(p->next[k] == NULL) return 0;
p = p->next[k];
}
return p->x;
}
void init()
{
int i;
for(i = 1; i <= 510000; i++)
{
father[i] = i;
}
memset(deg, 0, sizeof(deg));
cnt = 0;
}
int find(int x)
{
if(x != father[x])
{
father[x] = find(father[x]);
}
return father[x];
}
void Union(int x, int y)
{
father[x] = y;
}
bool judge() //判断是否满足欧拉
{
int i, k, odd = 0;
for(i = 1; i <= cnt; i++)
{
if(deg[i]%2 == 1) odd++;
}
if(odd != 0 && odd != 2) return false;
k = find(1);
for(i = 2; i <= cnt; i++)
{
if(k != find(i)) return false;
}
return true;
}
int main()
{
int x, y, fx, fy;
char s1[15], s2[15];
init();
root = create();
while(scanf("%s %s", s1, s2) != EOF)
{
x = search(s1); //映射求编号速度太慢
y = search(s2); //用字典树来求编号
if(x == 0) insert(s1, x = ++cnt);
if(y == 0) insert(s2, y = ++cnt);
deg[x]++;
deg[y]++;
fx = find(x);
fy = find(y);
if(fx != fy) Union(fx, fy);
}
if(judge()) printf("Possible\n");
else printf("Impossible\n");
return 0;
}
分享到:
相关推荐
【标题】"POJ2513-Colored Sticks【TrieTree+MergeSet+EulerPath】"涉及的是一道编程竞赛题目,主要考察参赛者的数据结构与算法应用能力,特别是Trie树(字典树)、并查集(MergeSet)以及欧拉路径(Euler Path)这...
一种常见的方法是使用深度优先搜索(DFS)或广度优先搜索(BFS)来构建线段之间的连接,并通过并查集(Disjoint Set)数据结构来判断是否存在不相交的集合。 1. **数据结构**:首先,我们需要用数组或者链表存储...
poj2492 A Bug's Life并查集应用的扩展,希望可以给大家带来用处
根据给定的信息,本文将详细解释“POJ 1988 简单并查集”中的核心知识点,包括并查集的基本概念、代码实现以及在本题中的具体应用。 ### 并查集基本概念 并查集是一种用于处理一些不交集的合并及查询问题的数据...
标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...
poj 2978 Colored stones.md
### 欧拉回路题集解析 #### 欧拉回路概念 欧拉回路(Eulerian Circuit)是指在一个无向图或有向图中,如果存在一条闭合路径,该路径通过每条边恰好一次,则这条路径称为欧拉回路。一个能够包含欧拉回路的图称为...
详细解释 ,既有源代码又有书面文字解释,ppt,在VC6上完成
* 简单并查集的应用 * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj3253 * 堆 * Trie树:静态建树、动态建树 + poj2513 四、简单搜索 * 深度优先搜索...
此外,它也是算法竞赛中的常见题目类型,例如POJ等在线编程平台上的题目就经常涉及并查集的使用。 综上所述,并查集是一种非常实用的数据结构,它在处理集合的连接与查找问题时具有高效性和灵活性,对于理解和掌握...
1. poj2524.cpp:这是一个POJ(Problem Setter's Online Judge)的编程题目,通常涉及到特定的算法问题,可能需要利用并查集解决连通性或路径查找问题。 2. hdoj1233最小生成树,克鲁斯卡尔.cpp:最小生成树是图论...
* 并查集的高级应用:POJ1703、POJ2492 * KMP算法:POJ1961、POJ2406 * 左偏树(可合并堆) 四、搜索 * 最优化剪枝和可行性剪枝 * 较为复杂的动态规划:POJ1191、POJ1054、POJ3280、POJ2029、POJ2948、POJ1925、...
poj 2452 Sticks Problem.md
* 并查集的高级应用:例如 poj1703、poj2492。 * KMP 算法:例如 poj1961、poj2406。 4. 搜索: * 最优化剪枝和可行性剪枝。 * 搜索的技巧和优化:例如 poj3411、poj1724。 * 记忆化搜索:例如 poj3373、poj...
在给定的标题“1089_bingchaji.rar_1089_bingchaji.rar _并查集”和描述“POJ1089 并查集可以解决 并查集加路径压缩”中,我们可以看到这是一个关于使用并查集解决特定问题的案例,可能来自于编程竞赛或练习。...
"西北工业大学POJ试题C++答案代码+课程设计"这一标题表明了资源的主要内容,涉及两个核心部分:一是西北工业大学的编程竞赛(POJ,Problem Oriented Judge System)的C++解题代码,二是与这些题目相关的课程设计。...
总的来说,解答POJ3009-Curling 2.0问题需要对DFS、向量、回溯和剪枝有深入的理解,并能灵活运用到具体问题中。通过对这些技术的熟练掌握,不仅可以解决这道题目,还能够为其他类似问题提供有效的解决方案。
这份代码用C++实现了经典算法并查集,来源于poj题目1182
【标签】中的"POJ 3733 Changing Digits"指明了这个题目在POJ平台上的编号和主题,"DFS"代表深度优先搜索,是一种用于遍历或搜索树或图的算法,它沿着树的深度方向逐层探索,直到找到目标节点或者搜索完整个树。...
《POJ1207-The 3n + 1 problem》是北京大学在线编程平台POJ上的一道经典算法题目,其主要涉及的知识点是数论和动态规划。本题目的核心是解决著名的“Collatz Conjecture”问题,也被称为“3n+1猜想”。 3n+1猜想是...