POJ 2513-Colored Sticks (字典树)

来源:互联网 发布:网络棋盘游戏 编辑:程序博客网 时间:2024/05/17 09:19

题目链接: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");elseprintf("Possible\n");return 0;}


原创粉丝点击