POJ 2513 Colored Sticks

7 篇文章 0 订阅
1 篇文章 0 订阅

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?


【题目分析】
这道题还是比较综合的,hash用map太慢,用普通的trie树节点过多,左儿子、右兄弟又太慢。于是遇到了这种带指针的trie,比较简单而且方便。
人生第一份带指针的代码


【代码】

#include <cstdio>
#include <cstring>
int f[500001],rank[500001],deg[500001],n;
struct trie
{
    int color;
    trie *next[26];
    trie()
    {
        color=0;
        memset(next,0,sizeof (next));
    }
}*root;
int insert(trie *p,char str[])
{
    int i;
    for (i=0;str[i]!='\0';++i)
    {
        int s=str[i]-'a';
        if (p->next[s]==NULL) p->next[s]=new trie;
        p=p->next[s];
        if (str[i+1]=='\0')
        {
            if (p->color==0) p->color=++n;
            deg[p->color]++;
        }
    }
    return p->color;
}
inline void init()
{for (int i=1;i<=50000;++i) f[i]=i;}
inline int gf(int k)
{
    if (f[k]==k) return k;
    else return f[k]=gf(f[k]);
}
inline void un(int a,int b)
{
    int fa=gf(a),fb=gf(b);
    if (fa==fb) return ;
    f[fa]=fb;
}
inline void read()
{
    char s1[11],s2[11];
    int x,y;
    n=0,root=new trie;
    init();
    while (~scanf("%s%s",s1,s2))
    {
        x=insert(root,s1);
        y=insert(root,s2);
        un(x,y);
    }
}
inline bool cal()
{
    int flag=0;
    for (int i=1;i<=n;++i)
    {
        if (flag&&f[i]==i) return false;
        if (f[i]==i) flag=1;
    }
    int x=0;
    for (int i=1;i<=n;++i) if (deg[i]%2) x++;
    if (x==0||x==2) return true;
    return false;
}
int main()
{
    read();
    if (cal()) printf("Possible\n");
    else printf("Impossible\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值