POJ 2513 Colored Sticks
2010-12-14 13:59
363 查看
解题思路:trie树+并查集(判断是否属于同一集合)+欧拉通路判断
代码
代码
#include <iostream> using namespace std; #define MAXN 5000001 #define MAXM 500001 char ch1[11],ch2[11],trie[MAXN]; int size,first[MAXN],next[MAXN],place[MAXN]; int n,root[MAXM],deg[MAXM]; int find(int x) { if(root[x]!=x)root[x]=find(root[x]); return root[x]; } int insert(char ch[]) { int i, t, p=0,l=strlen(ch); for(i=0;i<l;i++) { t=first[p]; while (t&&trie[t]!=ch[i])t=next[t]; if(!t) { trie[++size]=ch[i],next[size]=first[p]; first[p]=size,first[size]=0,p=size; } else p=t; } if(!place[p])place[p]=++n; return place[p]; } int main() { int i,r1,r2,r,odd; bool IsOk; for(i=0;i<MAXM;i++)root[i]=i; size=n=0; while(scanf("%s%s", ch1, ch2)!=EOF) { r1=insert(ch1),r2=insert(ch2); deg[r1]++,deg[r2]++; r1=find(r1),r2=find(r2); if(r1!=r2)root[r2]=r1; } for (IsOk=i=1,r=find(1),odd=0;i<n&&IsOk;i++) { if(root[i]==i&&i!=r)IsOk=false; if(deg[i]%2){odd++;if(odd>2)IsOk=false;} } IsOk?printf("Possible\n"):printf("Impossible\n"); return 0; }
相关文章推荐
- poj - 2513 Colored Sticks
- poj 2513 Colored Sticks 欧拉路
- POJ 2513 Colored Sticks
- POJ 2513 Colored Sticks 并查集 + 字典树 + 欧拉回路
- POJ2513——Colored Sticks(Trie树+欧拉回路+并查集)
- poj 2513 Colored Sticks(trie+并查集+欧拉通路)
- poj 2513 Colored Sticks【trie+并查集+欧拉回路】
- poj 2513 colored sticks
- poj_2513 Colored Sticks(字典树+并查集+欧拉通路)
- POJ 2513 Colored Sticks
- POJ 2513 Colored Sticks(字典树+欧拉路径)
- POJ 2513-Colored Sticks (字典树)
- poj 2513 Colored Sticks (无向欧拉路+字典树)
- (字典树+欧拉通路) poj 2513 Colored Sticks
- POJ 2513 Colored Sticks(欧拉回路判断+字典树Trie+并查集)
- POJ 2513 Colored Sticks
- POJ 2513 Colored Sticks
- POJ 2513 Colored Sticks(hash + 欧拉道路)
- poj 2513 Colored Sticks(欧拉回路 并查集 路径压缩 字典树)(困难)
- poj 2513 Colored Sticks