http://poj.org/problem?id=2513 题目的意思是说给一些木棒,每个木棒的头尾是不同的颜色,如果两个木棒首尾颜色相同就可以相接,问是否可以让所有的木棒都连起来。
我是用的并查集和trie树和欧拉回路来判断的。建立trie树的过程中捎带合并集合,用并查集判断是否只有一个环,如果不是,则直接输出“Imb“然后再根据欧拉回路的条件判断,欧拉回路的条件:度为奇数的点的个数不能超过两个。
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 using namespace std;
5 #define N 250001
6 char s[20],t[20];
7 int num,tem;
8 int a[N*2],f[N*2];
9 struct node
10 {
11 int k;
12 node *key[26];
13 node()
14 {
15 int i;
16 for(i=0;i<26;i++)
17 key[i]=NULL;
18 k=-1;
19 }
20 }*root;
21 int insert(char *s)
22 {
23 int i,len=strlen(s);
24 node *p;
25 p=root;
26 for(i=0;i<len;i++)
27 {
28 int t=s[i]-'a';
29 if(p->key[t]!=NULL) p=p->key[t];
30 else
31 {
32 p->key[t]=new node;
33 p=p->key[t];
34 }
35 }
36 if(p->k==-1) p->k=num++;
37 return p->k;
38 }
39 int find(int x)
40 {
41 if(a[x]!=x) return a[x]=find(a[x]);
42 return a[x];
43 }
44 int main()
45 {
46 int i;
47 num=0;
48 root=new node;
49 char str[30];
50 memset(f,0,sizeof(f));
51 for(i=0;i<N;i++)
52 a[i]=i;
53 while(gets(str))
54 {
55 sscanf(str,"%s%s",s,t);
56 int x=insert(s);
57 int y=insert(t);
58 f[x]++;f[y]++;
59 int xx=find(x);
60 int yy=find(y);
61 if(xx!=yy) a[xx]=yy; //合并集合
62 }
63 int sum=0;
64 for(i=0;i<num;i++)
65 {
66 if(i==find(i)) sum++;
67 }
68 int flag=0;
69 if(sum>1) {cout<<"Impossible\n";flag=1;}
70 if(!flag)
71 {
72 sum=0;
73 for(i=0;i<num;i++)
74 {
75 if(f[i]%2) sum++; // 根据欧拉回路判断
76 }
77 if(sum>2) cout<<"Impossible\n";
78 else cout<<"Possible\n";
79 }
80 return 0;
81 }