POJ 2513 Colored Sticks

解题思路:trie树+并查集(判断是否属于同一集合)+欧拉通路判断

代码
   
     
#include < iostream >
using namespace std;
#define MAXN 5000001
#define MAXM 500001
char ch1[ 11 ],ch2[ 11 ],trie[MAXN];
int size,first[MAXN],next[MAXN],place[MAXN];
int n,root[MAXM],deg[MAXM];

int find( int x)
{
if (root[x] != x)root[x] = find(root[x]);
return root[x];
}
int insert( char ch[])
{
int i, t, p = 0 ,l = strlen(ch);
for (i = 0 ;i < l;i ++ )
{
t
= first[p];
while (t && trie[t] != ch[i])t = next[t];
if ( ! t)
{
trie[
++ size] = ch[i],next[size] = first[p];
first[p]
= size,first[size] = 0 ,p = size;
}
else p = t;
}
if ( ! place[p])place[p] =++ n;
return place[p];
}
int main()
{
int i,r1,r2,r,odd;
bool IsOk;
for (i = 0 ;i < MAXM;i ++ )root[i] = i;
size
= n = 0 ;
while (scanf( " %s%s " , ch1, ch2) != EOF)
{
r1
= insert(ch1),r2 = insert(ch2);
deg[r1]
++ ,deg[r2] ++ ;
r1
= find(r1),r2 = find(r2);
if (r1 != r2)root[r2] = r1;
}
for (IsOk = i = 1 ,r = find( 1 ),odd = 0 ;i < n && IsOk;i ++ )
{
if (root[i] == i && i != r)IsOk = false ;
if (deg[i] % 2 ){odd ++ ; if (odd > 2 )IsOk = false ;}
}
IsOk
? printf( " Possible\n " ):printf( " Impossible\n " );
return 0 ;
}

 

你可能感兴趣的:(color)