poj 2513 Colored Sticks Trie树

来源:互联网 发布:openwrt网络尖兵 编辑:程序博客网 时间:2024/06/13 07:40
Colored Sticks
Time Limit: 5000MS Memory Limit: 128000KTotal Submissions: 32172 Accepted: 8493

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

Hint

Huge input,scanf is recommended.

Source

The UofA Local 2000.10.14

给出一些木棍两头都有颜色,问是否能连成一条线,欧拉路径+并查集+trie数

#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;#define Max 500010struct node{int x;node *next[26];};int degree[Max],fa[Max],cnt,ant;node *root , mem[Max*10];node * create(){node * p =&mem[ant++];for(int i=0;i<26;i++){p->next[i]=NULL;}return p;}void insert(char *s,int x){node * p =root;int k;for(int i=0;i<strlen(s);i++){k=s[i]-'a';if(p->next[k]==NULL){p->next[k]=create();}p=p->next[k];}p->x=x;}int search(char *s){node *p = root;int k;for(int i=0;i<strlen(s);i++){k=s[i]-'a';if(p->next[k]==NULL) {return 0;}p=p->next[k];}return p->x;}void init(){for(int i=1;i<=Max;i++){fa[i]=i;}memset(degree,0,sizeof(degree));}int find(int x){if(x!=fa[x]){fa[x]=find(fa[x]);}return fa[x];}void Union(int a,int b){fa[a]=b;}bool judge(){int u=0;for(int i=1;i<=cnt;i++){u+=degree[i]%2;}if(u>2||u==1) return false;u=find(1);for(int i=2;i<=cnt;i++){if(find(i)!=u) {cout<<i;return false;}}return true;}int main(){int x,y;int xx,yy;char s1[15],s2[15];init();root = create();cnt =0 ;while(~scanf("%s %s",s1,s2)){x=search(s1);y=search(s2);if(x==0) insert(s1,x = ++cnt);if(y==0) insert(s2,y = ++cnt);degree[x]++;degree[y]++;xx=find(x);yy=find(y);if(xx!=yy){Union(xx,yy);}}if(judge()) cout<<"Possible";else cout<<"Impossible";return 0;}




0 0
原创粉丝点击