题目链接:http://poj.org/problem?id=2513
题意:给你n个木棒,每个木棒两端各有一种颜色,两个木棒能连在一起当且仅当两个木棒有相同的一种颜色,问你这n个木棒能否连在一起。。
题解:首先需要判断能否构成欧拉回路,判断的方法很简单,判断每个木棒两端的的颜色出现多少次即可,假如有出现颜色的度为奇数次的话,只能出现两个,否则必不能构成欧拉回路,剩下的就是给每种颜色一个编号即可,字典树跑一发。
PS:这道题是去年就写过的题,只是想换种姿势搞一搞。。。。
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
#define inf 100000000000
#define mod 1000000007
#define maxn 530010
#define lowbit(x) (x&-x)
#define eps 1e-10
int degree[maxn],size=1,fa[maxn],cnt[maxn][27],vis[maxn],color;
char s1[20],s2[20];
int insert(char a[])
{
int u=0,len=strlen(a),i;
for(i=0;i<len;i++)
{
int v=a[i]-'a';
if(!cnt[u][v])
{
vis[size]=0;
cnt[u][v]=size++;
}
u=cnt[u][v];
}
if(!vis[u])
vis[u]=++color;
return vis[u];
}
int find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=find(fa[x]);
}
int main(void)
{
int i,ans=0;
for(i=0;i<maxn;i++)
fa[i]=i,degree[i]=0;
while(scanf("%s%s",s1,s2)!=EOF)
{
int t1=insert(s1);
int t2=insert(s2);
degree[t1]++;degree[t2]++;
int f1=find(t1),f2=find(t2);
if(f1!=f2)
fa[f1]=f2;
}
for(i=1;i<=color;i++)
{
if(degree[i]%2==1)
ans++;
if(ans>2 || find(1)!=find(i))
{
printf("Impossible\n");
return 0;
}
}
if(ans==1)
printf("Impossible\n");
else
printf("Possible\n");
return 0;
}
|