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 }
原文地址:https://www.cnblogs.com/wanglin2011/p/2871778.html