特别好的一道综合题目,题木很简单,给出几段木棍,两端的颜色,问你是否能够组成一根长木棍,要求相接处用同一种颜色....
首先要把颜色字符串给离散化标号,用字典树动态建立,然后标号后,再判断欧拉路之前要先用并查集判断连通性,基本就是这个思路了
#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; }