poj 2513 字典树+并查集

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

题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。

思路:刚开始用map去做映射,超时了。。。都忘记字典树了,于是用字典树去映射,记录每个点出现的次数,当奇数顶点等,1或超过2,必然不可能,最后还要判断点之间是不是连通,不连通必然不可能

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int N = 26;
const int LEN = 500100;
int cnt = 0;
int par[LEN];

struct trie
{
    int id;
    bool f;
    trie *next[N];
    trie()
    {
        id = 0;
        f = false;
        memset(next, 0, sizeof next);
    }
};
trie *root = new trie;
void init()
{
    for(int i = 0; i < LEN; i++)
        par[i] = i;
}

int ser(int x)
{
    int r = x;
    while(par[r] != r) r = par[r];

    int i = x, j;
    while(i != r)
        j = par[i], par[i] = r, i = j;
    return r;
}

void unite(int x, int y)
{
    x = ser(x), y = ser(y);
    if(x == y) return;
    par[x] = y;
}

int create_trie(char *str) /*把每个单词映射成数字,并返回值,已存在的直接返回值*/
{
    int len = strlen(str);
    trie *p = root;
    for(int i = 0; i < len; i++)
    {
        int j = str[i]-'a';
        if(p -> next[j] == NULL)
            p -> next[j] = new trie;
        p = p -> next[j];
    }
    if(p -> f) return p -> id;
    else
    {
        p -> f = true;
        return p -> id = cnt++;
    }
}

int main()
{
    char s1[N], s2[N];
    int degree[LEN];

    memset(degree, 0, sizeof degree);
    init();
    while(~ scanf("%s%s", s1, s2))
    {
        int x = create_trie(s1);
        int y = create_trie(s2);
        degree[x]++;
        degree[y]++;
        unite(x, y);
    }

    int tmp = 0;
    for(int i = 0; i < cnt; i++)
        if(degree[i] & 1) tmp++;
    if(tmp > 2 || tmp == 1) printf("Impossible\n"); /*奇度顶点个数满足此条件,必定不可能*/
    else
    {
        /*用并查集判断是不是连通图,不是连通图必然不可能*/
        int k = ser(0);
        bool f = true;
        for(int i = 0; i < cnt; i++)
            if(k != ser(i))
            {
                f = false; break;
            }
        if(f) printf("Possible\n");
        else printf("Impossible\n");
    }

    return 0;
}


你可能感兴趣的:(并查集,字典树)