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

题目地址:POJ 2513

刚开始没想到字典树,用的map函数一直TLE,由于上一次的签到题由于没想到字典树而卡了好长时间的深刻教训,于是过了不久就想起来用字典树了,(为什么是在TLE了5次之后。。T^T)然后把map改成了字典树,然后就过了。

这题居然不知不觉的用上了欧拉回路。。其实当时我是这样想的。。因为相互接触的必须要相同,所以除了两端外,其他的都是两两相同的,所以除了两端的颜色外其他的的个数必须为偶数。然后两端的可能相同可能不相同,相同的话,说明所有的都是偶数个数了,不相同的话那就只有这两个颜色个数为奇数。也就是判断保证连通性的同时,只要再保证颜色的个数为奇数的只有0个或两个,由于总个数为偶数,所以这里只要有一个奇数,那肯定还有一个奇数的,不可能存在1个奇数的情况,所以只需要判断是否大于2就行了。赛后才知道原来这就叫欧拉回路。。=
  = !

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include<algorithm>

using namespace std;
int d[500000], cnt, n, bin[500000];
struct node
{
    int flag;
    node *next[30];
};
node T[5000000];
node *newnode()
{
    int i;
    node *p=&T[cnt++];
    for(i=0;i<26;i++)
    {
        p->next[i]=NULL;
    }
    p->flag=0;
    return p;
}
int charu(node *root, char *s)
{
    int i, x, len=strlen(s);
    node *p=root;
    for(i=0;i<len;i++)
    {
        x=s[i]-'a';
        if(p->next[x]==NULL)
            {
                p->next[x]=newnode();
            }
        p=p->next[x];
    }
    if(p->flag)
        return p->flag;
    else
    {
        p->flag=++n;
        return n;
    }
}
int find1(int x)
{
    return bin[x]==x?x:bin[x]=find1(bin[x]);
}
void merger(int x, int y)
{
    int f1=find1(bin[x]);
    int f2=find1(bin[y]);
    if(f1!=f2)
    {
        if(f2>f1)
            bin[f2]=f1;
        else
            bin[f1]=f2;
    }
}
int main()
{
    int i, j, s=0, x=0, x1, x2;
    char s1[11], s2[11];
    memset(d,0,sizeof(d));
    for(i=1;i<=500000;i++)
    {
        bin[i]=i;
    }
    n=0;
    cnt=0;
    node *root;
    root=newnode();
    while(scanf("%s%s",s1,s2)!=EOF)
    {
        x1=charu(root,s1);
        x2=charu(root,s2);
        d[x1]++;
        d[x2]++;
        merger(x1,x2);
        //printf("%d %d\n",x1,x2);
    }
    for(i=1;i<=n;i++)
    {
        if(d[i]%2)
            s++;
        if(s>2)
        {
            x=1;
            break;
        }
    }
    if(x)
        printf("Impossible\n");
    else
        {
            int y=0;
            for(i=1;i<=n;i++)
            {
                if(find1(bin[i])!=1)
                {
                    y=1;
                    break;
                }
            }
            if(y)
                printf("Impossible\n");
            else
                printf("Possible\n");
        }
    return 0;
}

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

时间: 2024-10-22 23:26:57

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

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

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

[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 (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 st

poj 2513 Colored Sticks (trie 树)

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

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

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

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> #i

[欧拉回路] poj 2513 Colored Sticks

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