题意:给你n个木棒,每个木棒的两段都用不同的颜色,没两根木棒连接的端点必须是同一种颜色。问你以木棒作边,颜色做端点是否能是欧拉路。
想了很久,终于通过字典树的方法吧每种颜色替换为不同的编号,只要定义一个flag数组储存一下当前颜色的种类,最后返回即可。
在使用并查集判断欧拉路。
代码如下:
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxm=250001;
int p[maxm],tr[maxm][26],flag[maxm*10],ll=1,col=0,g[maxm*10];
char a[15],b[15];
int insert(char str[]);
int find(int k);
int main()
{
int n,i,j,k,t1,t2,x1,x2;
memset(flag,-1,sizeof(flag));
memset(p,-1,sizeof(p));
memset(tr,-1,sizeof(tr));
while(scanf("%s %s",a,b)!=EOF)
{
t1=insert(a);t2=insert(b);
g[t1]++;g[t2]++;
t1=find(t1);t2=find(t2);
if(t1!=t2)
p[t1]=t2;
}
x1=x2=0;
for(i=0;i<col;i++)
{
if(p[i]==-1)
x1++;
if(g[i]%2==1)
x2++;
if(x1>1)
break;
if(x2>2)
break;
}
if((x1==0 || x1==1)&&(x2==0 || x2==2))
printf("Possible\n");
else
printf("Impossible\n");
return 0;
}
int insert(char str[])
{
int i,j,k;
k=0;
for(i=0;str[i]!='\0';i++)
{
if(tr[k][str[i]-'a']==-1)
{
tr[k][str[i]-'a']=ll;
ll++;
}
k=tr[k][str[i]-'a'];
}
if(flag[k]==-1)
{
flag[k]=col++;
return flag[k];
}
else
return flag[k];
}
int find(int k)
{
if(p[k]==-1)
return k;
return find(p[k]);
}