您的位置:首页 > 其它

poj 2513 无向图欧拉路+Trie

2016-07-12 19:27 357 查看
题意:
给出一些木棍,每个木棍两端有两种颜色,不同的木坤如果首尾颜色相同,那么就可以连接起来,问是否所有的木棍看可以连成一条线?

分析:
这题跟Uva10129单词那题几乎是一样的,只不过那题是有向图,因为单词的首尾是固定的嘛!而这题是无向图,无向图的话先判断一下是否是连通图,然后再判断一下每个点的度,如果没有奇度点或者奇度点只有两个那么是可以构成无向欧拉图的。把不同颜色当做不同的点,用Trie树给每种颜色分配一个ID值,来区分不同颜色,然后一根木棍上的两种颜色用并查集连边,最后判断整个图是否连通,如果连通在判断每个点的度。

#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
const int maxnode=5e6+10;
const int N=500000+10;
struct Trie
{
int ch[maxnode][26];
int val[maxnode];
int sz,id;
void clear(){id=1;sz=1;memset(ch[0],0,sizeof(ch[0]));}
int idx(char c){return c-'a';}

int insert(const char *s)
{
int u=0,n=strlen(s);
for(int i=0;i<n;i++){
int c=idx(s[i]);
if(!ch[u][c]){
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
if(val[u]==0)val[u]=id++;
return val[u];
}

};
char a[11],b[11];
int fa
,in
;
int findfa(int x){return x==fa[x]?x:fa[x]=findfa(fa[x]);}
Trie trie;
int main()
{
//freopen("f.txt","r",stdin);
for(int i=0;i<N;i++)fa[i]=i;
memset(in,0,sizeof(in));
trie.clear();
while(~scanf("%s%s",a,b)){
int ida=trie.insert(a);
int idb=trie.insert(b);
in[ida]++;in[idb]++;
int x=findfa(ida),y=findfa(idb);
if(x!=y)fa[x]=y;
}
int num=0;
for(int i=1;i<trie.id;i++)if(findfa(i)==i)num++;
if(num>1){
printf("Impossible\n");return 0;
}
num=0;
for(int i=1;i<trie.id;i++)if(in[i]&1)num++;
if(num==0||num==2)printf("Possible\n");
else printf("Impossible\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: