特别好的一道综合题目,题木很简单,给出几段木棍,两端的颜色,问你是否能够组成一根长木棍,要求相接处用同一种颜色....
首先要把颜色字符串给离散化标号,用字典树动态建立,然后标号后,再判断欧拉路之前要先用并查集判断连通性,基本就是这个思路了
#include<iostream>
#include<cstring>
using namespace std;
char clr1[11],clr2[11];
int p[500010];
int r[500010];
int rec[500010];
int num=1;
struct node
{
int id,i;
node*next[27];
node()
{
for(i=0;i<27;i++)
next[i]=NULL;
id=0;
}
};
node*root=new node;
void insert(char*temp)
{
int len=strlen(temp);
int i;
node*p=root;
for(i=0;i<len;i++)
{
if(p->next[temp[i]-'a']==NULL)
p->next[temp[i]-'a']=new node;
p=p->next[temp[i]-'a'];
}
if(p->id==0)
p->id=num++;
}
int search(char*temp)
{
node*p=root;
int i,len=strlen(temp);
for(i=0;i<len;i++)
p=p->next[temp[i]-'a'];
return p->id;
}
void make_set(int x)
{
p[x]=x;
r[x]=1;
}
int find_set(int x)
{
if(p[x]!=x)
p[x]=find_set(p[x]);
return p[x];
}
void Union(int x,int y)
{
if(r[x]>=r[y])
{
p[y]=x;
r[x]=r[x]+r[y];
}
else
{
p[x]=y;
r[y]=r[y]+r[x];
}
}
int main()
{
while(scanf("%s %s",clr1,clr2)!=EOF)
{
insert(clr1);
insert(clr2);
int x1=search(clr1);
int x2=search(clr2);
rec[x1]++;
rec[x2]++;
if(p[x1]==0)
make_set(x1);
if(p[x2]==0)
make_set(x2);
Union(find_set(x1),find_set(x2));
}
int i=0,sum=0;
for(i=1;i<num;i++)
{
if(rec[i]%2!=0)
sum++;
if(sum>2)
{
printf("Impossible\n");
return 0;
}
}
for(i=1;i<num;i++)
{
if(find_set(i)!=find_set(1))
{
printf("Impossible\n");
return 0;
}
}
printf("Possible\n");
return 0;
}

浙公网安备 33010602011771号