POJ Colored Sticks(2513) -trie树&欧拉回路

题意:给你n根木棒,每个木棒两端都涂有颜色,任意两根木棒可以连在一起,如果他们有一端颜色是相同的,问你最后是否能把所有的木棒连成一根。

题解:神奇的trie &欧拉回路(用map水的TLE了难过

注:COPY的题解,第一见识trie &学习了结构体定义时初始化 &一些新的函数(new开辟类型新空间,要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.

#define INF 0x7fffffff
#define eps (1e-9)
#define clearto(s,x) memset(s,x,sizeof(s))
using namespace std;
typedef long long llong;
int n,m,tot=0;
int du[500009],fa[500009];
char a[15],b[15];
struct trie{
    int id;  bool end;      trie *next[26];
    trie()
    {   id =-1;   end =0;   for(int i=0;i<26;i++)  next[i] =NULL;   }

}   *root;
int getid(char *s){
    trie *tmp =root;
    for(int i=0;i<strlen(s);i++){
        if(tmp->next[s[i]-97] ==NULL)
        {  tmp->next[s[i]-97] =new trie;  }
        tmp =tmp->next[s[i]-97];
    }
    if(tmp->end)  return tmp->id;
    tmp->end =true;      tmp->id =tot;   tot++;
    return  tmp->id;
}
int find(int x){
    if(fa[x]!=x) fa[x] =find(fa[x]);     return fa[x];
}
void link(int x,int y) {  fa[find(x)] =  fa[find(y)];   }

int main()
{
    //freopen("D:\data.txt","r",stdin);
    int TT,i,k,t=0;
    root = new trie;    clearto(du,0);
    for(i=0;i<500005;i++)       fa[i] =i;
    while(scanf("%s %s",a,b)!=EOF)
    {
        int x = getid(a), y = getid(b);
        du[x]++; du[y]++;     link(x,y);
    }
    int old =0;
    for(i=0;i<tot;i++) if(du[i]&1)  old++;
    int f =find(1);
    for(i=0;i<tot;i++) if(find(i)!=f) { old=-1; break; }
    printf("%s",(old==0||old==2)? "Possible":"Impossible");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值