首页 > 代码库 > POJ2513 Colored Sticks (并查集+trie)
POJ2513 Colored Sticks (并查集+trie)
传送门
Colored Sticks
Time Limit: 5000MS | Memory Limit: 128000K | |
Description
You are given a bunch of wooden sticks. Each endpoint of each stick is colored with some color. Is it possible to align the sticks in a straight line such that the colors of the endpoints that touch are of the same color?
Input
Input is a sequence of lines, each line contains two words, separated by spaces, giving the colors of the endpoints of one stick. A word is a sequence of lowercase letters no longer than 10 characters. There is no more than 250000 sticks.
Output
If the sticks can be aligned in the desired way, output a single line saying Possible, otherwise output Impossible.
Sample Input
blue redred violetcyan blueblue magentamagenta cyan
Sample Output
Possible
Hint
Huge input,scanf is recommended.
Source
The UofA Local 2000.10.14
回顾了一下欧拉图的知识。。整个图的奇度点个数如果>=3或只有1个 就不能一笔画画完
中间re了几次。。因为trie里我开了n*30,但是外面数组只开了n...
1 #include<set> 2 #include<queue> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<iostream> 7 #include<algorithm> 8 using namespace std; 9 const int N = 250010;10 #define For(i,n) for(int i=1;i<=n;i++)11 #define For0(i,n) for(int i=0;i<n;i++)12 #define Rep(i,l,r) for(int i=l;i<=r;i++)13 14 char s1[11],s2[11];15 int n,in[N*30],fa[N*30],ans;16 struct Trie{17 int sz,ch[N*30][26],v[N*30],Loc[N*30];18 Trie(){sz=1;}19 int insert(char st[]){20 int now=1;v[1]++;int len=strlen(st);21 For0(i,len){22 int id=st[i]-‘a‘;23 if(!ch[now][id]) ch[now][id]=++sz;24 v[now=ch[now][id]]++;25 }26 if(Loc[now]) return Loc[now];27 else return Loc[now]=++n;28 }29 }trie;30 31 int find(int i){32 if(fa[i]==i) return i;33 else return fa[i]=find(fa[i]);34 }35 36 int main(){37 #ifndef ONLINE_JUDGE38 freopen("trie.in","r",stdin);39 #endif // ONLINE_JUDGE40 For0(i,N*30) fa[i]=i;41 while(scanf("%s %s",&s1,&s2)!=EOF){42 int x=trie.insert(s1),y=trie.insert(s2);43 in[x]++;in[y]++;44 int fx=find(x),fy=find(y);45 if(fx!=fy) fa[fx]=fy;46 }47 int checks=find(1);48 Rep(i,2,n) if(find(i)!=checks){49 puts("Impossible\n");50 return 0;51 }52 For(i,n) {53 in[i]=in[i]%2;54 if(in[i]) ans++;55 }56 if(ans==1||ans>=3) puts("Impossible");57 else puts("Possible");58 return 0;59 }
POJ2513 Colored Sticks (并查集+trie)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。