Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
静态字典树+并查集+欧拉回路 略超1s 差点爆内存 但代码风格较简洁#include<cstdio> #include<iostream> #include<cstring> using namespace std; int trie[510000][26],num[510000][26],degree[510001],f[500001],n,r; //trie 字典树,num 记录当前这个color的序号,node记录每一种color的度,f 并查集 不用多说,n和r分别用于更新trie和num int insert(char s[11])//插入一个节点(颜色),返回该种颜色的序号 { int i,j,l; j=0; l=strlen(s); for(i=0;i<l;i++) if(trie[j][s[i]-'a']) j=trie[j][s[i]-'a']; else j=trie[j][s[i]-'a']=++r; if (num[j][s[l-1]-'a']==0) num[j][s[l-1]-'a']=++n; return num[j][s[l-1]-'a']; } int find(int x)//并查集 { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } int main() { int i,j; char s1[11],s2[11]; memset(trie,0,sizeof(trie)); memset(num,0,sizeof(num)); memset(degree,0,sizeof(degree)); n=0; r=0; for(i=1;i<=500000;i++) f[i]=i; while(scanf("%s %s",&s1,&s2)!=EOF) { i=insert(s1); degree[i]++; j=insert(s2); degree[j]++; i=find(i); j=find(j); if(i!=j) f[j]=i; } int count=0; for(i=1;i<=n;i++) { if(i==find(i)) count++; if (count>1) break; }//判断图的连通性 即是否只有一个父亲 if (count>1) printf("Impossible\n"); else { j=0; for(i=1;i<=n;i++) if (degree[i]%2) j++; if(j==0 || j==2) printf("Possible\n");//判断无向图欧拉回路的条件之一 度为奇数的点的个数要么0 要么2 else printf("Impossible\n"); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator