题意;给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。
思路注意
1 此题需要构建无向图;
2 通过字典树得到每种颜色所对应的编号
3 通过判断是否为欧拉路或欧拉回路
无向图欧拉回路 : 图联通 ,并且所有的点的度都为偶数
无向图欧拉路 : 图联通 ,并且只有两个点的度都为为奇数
联通的判断 利用并查集
字典树用于映射编号;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define LL long long
using namespace std;
struct node
{
int id;
int next[26];
}p[2500000]; //
int top; ///前向星
int ID; ///标号
int Creat()
{
memset(p[top].next,-1,sizeof(p[top].next));
p[top].id=0;
return top++;
}
int Build(char s[])
{
int k=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int ch=s[i]-'a';
if(p[k].next[ch]==-1)
p[k].next[ch]=Creat();
k=p[k].next[ch];
}
if(!p[k].id)
{
p[k].id=ID; ///映射出 字母对应的编号
ID++;
return p[k].id;
}
else
return p[k].id;
}
int bin[2600000];
int Find(int x)
{
return x==bin[x]?x:bin[x]=Find(bin[x]);
}
int Union(int x,int y)
{
int fx=Find(x);
int fy=Find(y);
if(fx!=fy)
bin[fx]=fy;
}
int du[2500001];
int main()
{
char s1[20],s2[20];
top=0;
ID=1;
for(int i=0;i<2500001;i++)
bin[i]=i;
int k=Creat();
while(~scanf("%s%s",s1,s2))
{
// if(s1[0]=='0')
// break;
int x=Build(s1);
int y=Build(s2);
du[x]++;
du[y]++;
Union(x,y);
}
int root=Find(1);
int flag=0;
if(ID==1)
{
printf("Possible\n");
return 0;
}
for(int i=1;i<ID;i++)
{
if(Find(i)!=root) ///不连通
{
flag=3;
break;
}
if(du[i]%2)
flag++;
}
if(flag==0||flag==2)
printf("Possible\n");
else
printf("Impossible\n");
return 0;
}