POJ 2513 Colored Sticks (Trie树+并查集+欧拉路)

Colored Sticks

Time Limit: 5000MS   Memory Limit: 128000K
Total Submissions: 31490   Accepted: 8320

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

Possible

Hint

Huge input,scanf is recommended.

Source

The UofA Local 2000.10.14

题目链接:http://poj.org/problem?id=2513

题目大意:给一些木棍,两端都有颜色,只有两根对应的端点颜色相同才能相接,问能不能把它们接成一根木棍

题目分析:题意不难,典型的无向图判断是否存在欧拉通路或回路的问题,但是字符串太多,用map超时,这里使用Trie树给每个木棍标号,判断是否存在欧拉通路或回路抓住两点就行了,第一是图连通,第二是奇数度结点只能有0个(回路)或2个(通路)

#include <cstdio>
#include <cstring>
int const MAX = 500005;
int fa[MAX], d[MAX], cnt;

struct Trie
{
    int sz, t[MAX][15];
    int jud[MAX];
    Trie()
    {
        sz = 1;
        memset(t[0], -1, sizeof(t));
        jud[0] = 0;
    }
    void clear()
    {
        sz = 1;
        memset(t[0], -1, sizeof(t));
        jud[0] = 0;
    }
    int idx(char c)
    {
        return c - 'a';
    }
    void insert(char* s, int v)
    {
        int u = 0, len = strlen(s);
        for(int i = 0; i < len; i++)
        {
            int c = idx(s[i]);
            if(t[u][c] == -1)
            {
                memset(t[sz], -1, sizeof(t[sz]));
                jud[sz] = 0;
                t[u][c] = sz++;
            }
            u = t[u][c];
        }
        jud[u] = v;
    }
    int search(char* s)
    {
        int u = 0, len = strlen(s);
        for(int i = 0; i < len; i++)
        {
            int c = idx(s[i]);
            if(t[u][c] == -1)
                return -1;
            u = t[u][c];
        }
        if(jud[u])
            return jud[u];
        return -1;
    }
}t;

void Init()
{
    for(int i = 0; i < MAX; i++)
        fa[i] = i;
}

int Find(int x)
{
    return x == fa[x] ? x : fa[x] = Find(fa[x]);
}

void Union(int a, int b)
{
    int r1 = Find(a);
    int r2 = Find(b);
    if(r1 != r2)
        fa[r1] = r2;
}

bool eluer()
{
    int sum = 0, t = -1;
    for(int i = 1; i < cnt; i++)
        if(d[i] % 2)
            sum++;
    if(sum != 0 && sum != 2)
        return false;
    for(int i = 1; i < cnt; i++)
    {
        if(t == -1)
            t = Find(i);
        else if(Find(i) != Find(t))
            return false;
    }
    return true;
}

int main()
{
    char s1[20],s2[20];
    cnt = 1;
    Init();
    t.clear();
    while(scanf("%s %s", s1, s2) != EOF)
    {
        if(t.search(s1) == -1)
            t.insert(s1, cnt++);
        int u = t.search(s1);
        if(t.search(s2) == -1)
            t.insert(s2, cnt++);
        int v = t.search(s2);
        Union(u, v);
        d[u]++;
        d[v]++;
    }
    if(eluer())
        printf("Possible\n");
    else
        printf("Impossible\n");
}
时间: 2024-10-17 04:48:03

POJ 2513 Colored Sticks (Trie树+并查集+欧拉路)的相关文章

POJ 2513 Colored Sticks(字典树+并查集连通性+欧拉回路)

题目地址:POJ 2513 刚开始没想到字典树,用的map函数一直TLE,由于上一次的签到题由于没想到字典树而卡了好长时间的深刻教训,于是过了不久就想起来用字典树了,(为什么是在TLE了5次之后..T^T)然后把map改成了字典树,然后就过了. 这题居然不知不觉的用上了欧拉回路..其实当时我是这样想的..因为相互接触的必须要相同,所以除了两端外,其他的都是两两相同的,所以除了两端的颜色外其他的的个数必须为偶数.然后两端的可能相同可能不相同,相同的话,说明所有的都是偶数个数了,不相同的话那就只有这

[ACM] POJ 2513 Colored Sticks (Trie树,欧拉通路,并查集)

Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 29736   Accepted: 7843 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 st

POJ-2513 Colored Sticks(字典树+并查集+欧拉)

题目链接:Colored Sticks 一道3个知识点结合的题目,可以说单个知识点的题目,都会做,一旦知识点结合起来,题目就不简单了 思路:这个题开始看就知道是并查集,但是不好处理的不同种单词的统计,所以理所应当联想到字典树,上次做字典树的题目啸爷出的是统计相同单词数,这个题目和那个一样,把flag加个编号即可,再利用并查集. 1750ms  水过 #include <iostream> #include <cstdio> #include <cstdlib> #inc

poj 2513 Colored Sticks (trie 树)

链接:poj 2513 题意:给定一些木棒,木棒两端都涂上颜色,不同木棒相接的一边必须是 相同的颜色,求是否能将木棒首尾相接,连成一条直线. 分析:可以用欧拉路的思想来解,将木棒的每一端都看成一个结点 由图论知识可以知道,无向图存在欧拉路的充要条件为: ①     图是连通的: ②     所有节点的度为偶数,或者有且只有两个度为奇数的结点. 图的连通性可以用并查集,因为数据比较大,所以用并查集时要压缩路径, 所有节点的度(入度和出度的和)用数组记录就好 但是25w个木棒,有50w个结点,要怎么

poj 2513 Colored Sticks 并查集 字典树 欧拉回路判断

点击打开链接题目链接 Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 30273   Accepted: 8002 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 sti

POJ 2513 Colored Sticks(欧拉回路,字典树,并查集)

题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的. 转:kuangbing 无向图存在欧拉路的充要条件为: ①     图是连通的: ②     所有节点的度为偶数,或者有且只有两个度为奇数的节点. 图的连通可以利用并查集去判断. 度数的统计比较容易. view code//第一次用指针写trie,本来是用二维数组,发现数组开不下,只好删删改改,改成指针 //做这道题,知道了欧拉回路判定,还有用指针写trie #include

poj 2513 Colored Sticks(欧拉通路+并查集+字典树)

题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色,现在给定每个木棍两端的颜色,不同木棍之间拼接需要颜色相同的 端才可以,问最后能否将N个木棍拼接在一起. 解题思路:欧拉通路+并查集+字典树.欧拉通路,每个节点的统计度,度为奇数的点不能超过2个.并查集,判断节点 是否完全联通.字典树,映射颜色. #include <cstdio> #include <cstring> #include <string> #includ

poj 2513 Colored Sticks 彩色棒

poj  2513  Colored Sticks http://poj.org/problem?id=2513 题意:现在有几个木棒,每个木棒端点都着色,问:能否将它们排成一排,同时要满足相邻的的两端点颜色是一样的. trie+并查集+欧拉通路 方法:要想排成一排,可以变向的理解为从一个图里找到一个欧拉通路(一定要想到):如果只是孤零零的一个个小棒,这道题很难实现. 首先:要先要对所有颜色进行编号,由于事先又不知道有几种颜色,有哪几种颜色.故有一个笨方法,用map<int,string>容器

poj 2513 Colored Sticks(欧拉路径+并检查集合+特里)

题目链接:poj 2513 Colored Sticks 题目大意:有N个木棍,每根木棍两端被涂上颜色.如今给定每一个木棍两端的颜色.不同木棍之间拼接须要颜色同样的 端才干够.问最后是否能将N个木棍拼接在一起. 解题思路:欧拉通路+并查集+字典树. 欧拉通路,每一个节点的统计度,度为奇数的点不能超过2个.并查集,推断节点 是否全然联通. 字典树,映射颜色. #include <cstdio> #include <cstring> #include <string> #i