poj 2513 Colored Sticks
题目:http://poj.org/problem?id=2513
这个题的题意很好懂,感觉很简单,然后交了之后wa
后来意识到是自己的思路不正确,其实就是欧拉回路的问题
用到了trie树+并查集+欧拉
代码:
View Code
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define max 500010 5 using namespace std; 6 struct node 7 { 8 int num; 9 int flag; 10 node *next[26]; 11 node() 12 { 13 flag=0; 14 num=0; 15 for(int i=0;i<=26;i++) 16 { 17 next[i]=NULL; 18 } 19 } 20 }; 21 node *root=NULL; 22 int set[max*2]; 23 int n=0; 24 int find(int x) 25 { 26 if(x!=set[x]) 27 set[x]=find(set[x]); 28 return set[x]; 29 } 30 void merge(int x,int y) 31 { 32 x=find(x); 33 y=find(y); 34 if(x!=y) 35 { 36 set[y]=x; 37 } 38 return ; 39 } 40 int bianhao(char a[]) 41 { 42 node *p; 43 if(!root) 44 { 45 root=new node; 46 } 47 int len; 48 len=strlen(a); 49 int i; 50 int s; 51 p=root; 52 for(i=0;i<len;i++) 53 { 54 s=a[i]-'a'; 55 if(!p->next[s]) 56 { 57 p->next[s]=new node; 58 } 59 p=p->next[s]; 60 } 61 if(p->flag) 62 return p->num; 63 else 64 { 65 n++; 66 p->flag=1; 67 p->num=n; 68 return p->num; 69 } 70 } 71 int main() 72 { 73 char str1[11],str2[11]; 74 int degree[max];//总度数 75 int i; 76 memset(degree,0,sizeof(degree)); 77 for(i=1;i<=max;i++) 78 set[i]=i; 79 while(scanf("%s %s",str1,str2)!=EOF) 80 { 81 int s1=bianhao(str1); 82 int s2=bianhao(str2); 83 degree[s1]++; 84 degree[s2]++; 85 merge(s1,s2); 86 } 87 int s=find(1); 88 int num=0; 89 for(i=1;i<=n;i++) 90 { 91 if(degree[i]%2==1) 92 num++; 93 if(num>2)//奇数点个数大于2肯定不是欧拉 94 { 95 cout<<"Impossible"<<endl; 96 return 0; 97 } 98 if(find(i)!=s)//森林的情况 99 { 100 cout<<"Impossible"<<endl; 101 return 0; 102 } 103 } 104 if(num==1) 105 { 106 cout<<"Impossible"<<endl; 107 } 108 else//当奇数点个数是0或2时才是欧拉回路 109 { 110 cout<<"Possible"<<endl; 111 } 112 }