字典树 hash(代替map的映射) PKU2513

来源:互联网 发布:少年三国志转盘数据图 编辑:程序博客网 时间:2024/05/12 13:07

题意就是看能不能形成欧拉图,有没有一条欧拉道路,

图为无向图,那么需要具备以下几点才能满足,联通且(最多)有2个奇数点



Colored Sticks
Time Limit: 5000MS Memory Limit: 128000KTotal Submissions: 34526 Accepted: 9009

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 redred violetcyan blueblue magentamagenta cyan

Sample Output

Possible

代码

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int countn;int countz;int du[500100];int fa[500100];struct node{    int num;    struct node *next[30];};node tire[250005];node *creat(){    for(int i=0; i<26; i++)    {        tire[countn].next[i]=NULL;    }    tire[countn].num=0;    return &tire[countn++];}int hash(node *&root,char s[]){    if(!root)        root=creat();    int la=strlen(s);    node *p;    p=root;    for(int i=0; i<la; i++)    {        if(p->next[s[i]-'a']==NULL)            p->next[s[i]-'a']=creat();        p=p->next[s[i]-'a'];    }    if(!p->num)        p->num=countz++;    return p->num;}int find(int x){    if(x==fa[x])    {        return fa[x];    }    else return fa[x]=find(fa[x]);}void Union(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy)    {        fa[fx]=fy;    }}int main(){    char s1[30];    char s2[30];    node *root=NULL;    memset(du,0,sizeof(du));    countn=0;    countz=1;    for(int i=0; i<100000; i++)        fa[i]=i;    while(scanf("%s %s",s1,s2)!=EOF)    {        int x=hash(root,s1);        int y=hash(root,s2);        du[x]++;        du[y]++;        Union(x,y);    }    //printf("%d  \n",countz);    int flag=1;    int old=0;//奇数的度数大于2个,则不是欧拉图    for(int i=1; i<countz; i++)    {        //printf("%d ",du[i]);        if(du[i]%2)        {            old++;        }        if(old>2)        {            flag=0;            break;        }        if(find(i)!=find(1))        {            flag=0;            break;        }    }    if(flag)        printf("Possible\n");    else printf("Impossible\n");}

0 0
原创粉丝点击