题目链接:http://poj.org/problem?id=2513
题目大意:给一些木棍,两端都有颜色,只有两根对应的端点颜色相同才能相接,问能不能把它们接成一根木棍
无向图存在欧拉路的充要条件为:
① 图是连通的;
② 所有节点的度为偶数,或者有且只有两个度为奇数的节点。
图的连通可以利用并查集去判断。
这题数据比较坑,输入空数据的时候,输出possible。
数据比较大,首先需要将颜色的字符串和数字一一对应起来
用字典树对应起来
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<set>
#include<vector>
#include<sstream>
#include<queue>
#define ll long long
#define PI 3.1415926535897932384626
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=5000006;
int pre[maxn],vis[maxn];
int find(int x)
{
return x==pre[x]?x:pre[x]=find(pre[x]);
}
void mix(int a,int b)
{
int fx=find(a);
int fy=find(b);
if(fx!=fy) pre[fx]=fy;
}
int tire[maxn][30];
int pos=1;
void insert(char word[])
{
int i;
int c=0;
for(i=0;word[i];i++)
{
int n=word[i]-'a';
if(tire[c][n]==0)
tire[c][n]=pos++;
c=tire[c][n];
}
}
int query(char word[])
{
int c=0;
for(int i=0;word[i];i++)
{
int n=word[i]-'a';
c=tire[c][n];
//cout<<c<<endl;
}
return c;
}
int in[maxn];
int main()
{
for(int i=0;i<=maxn;i++) pre[i]=i;
char str1[20],str2[20];
memset(in,0,sizeof(in));
memset(vis,0,sizeof(vis));
while(scanf("%s%s",&str1,&str2)!=EOF)
{
insert(str1);
insert(str2);
int a=query(str1);
int b=query(str2);
vis[a]++;
vis[b]++;
//printf("a:%db:%d\n",a,b);
mix(a,b);
in[a]++;
in[b]++;
}
//cout<<pos<<endl;
if(pos==1)
{
printf("Possible\n");}
else{
int root=0;
for(int i=1;i<=pos;i++)
{
if(i==pre[i]&&vis[i])
{
root++;
}
}
if(root!=1)
{
printf("Impossible\n");
return 0;
}
//cout<<"11 "<<endl;
int flag=1;
int num=0;
for(int i=1;i<=pos;i++)
{
if(in[i]%2!=0)
{
flag=0;
num++;
}
}
if(flag==1||num==2)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}