poj 2513 Colored Sticks

// 判断图是否联通 在连通的基础上还要判断是否存在欧拉通路
// 判断连通就并查集了 判断是否存在欧拉通路: 点度数为数的点 ==1 >=3就是不存在的 其它是存在的
// 我开始用 map 判重 然后就悲剧了一上午 好久没写 Trie树了 都忘了、

#include <iostream> #include <string> #include <map> #include <algorithm> #include <queue> #include <math.h> #include <stdio.h> #include <string.h> #include <vector> using namespace std; #define MOD 1000000007 #define maxn 500100 char s1[20],s2[20]; int d[maxn];//,out[maxn]; int f[maxn],num[maxn]; int Fin(int x){ if(x!=f[x]) f[x]=Fin(f[x]); return f[x]; } int sz; int ch[maxn][26]; int val[maxn]; int idx(char c){ return c-'a';} void insert(char *s,int v){ int u=0;//,len=strlen(s); int c; for(int i=0;s[i]!='\0';i++){ 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]; } // printf("%d-",v); val[u]=v; } int search(char *s){ int u=0;//,len=strlen(s); int c; for(int i=0;s[i]!='\0';i++){ c=idx(s[i]); // printf("c=%c",s[i]); if(!ch[u][c]) return 0; u=ch[u][c]; } return val[u]; } int main(){ int i; int n=0; int u,v; for(i=1;i<=maxn;i++) f[i]=i,num[i]=1,d[i]=0; sz=1; memset(ch[0],0,sizeof(ch[0])); while(scanf("%s %s",s1,s2)!=EOF) { if(u=search(s1)){ d[u]++; } else{ insert(s1,++n); u=n; d[u]++; } if(v=search(s2)){ d[v]++; } else{ insert(s2,++n); v=n; d[v]++; } //printf("%d %d\n",u,v); u=Fin(u); v=Fin(v); if(u!=v){ if(num[u]>num[v]){ f[v]=u; num[u]+=num[v]; } else{ f[u]=v; num[v]+=num[u]; } } } int bf; bf=0; for(i=1;i<=n;i++) if(d[i]%2) bf++; if(bf==1||bf>2){ printf("Impossible\n");return 0;} bf=Fin(1); for(i=2;i<=n;i++) if(bf!=Fin(i)) { printf("Impossible\n"); return 0; } printf("Possible\n"); return 0; }

 

你可能感兴趣的:(color)