poj2513Colored Sticks(无向图的欧拉回路)
生活随笔
收集整理的這篇文章主要介紹了
poj2513Colored Sticks(无向图的欧拉回路)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 /*
2 題意:將兩端涂有顏色的木棒連在一起,并且連接處的顏色相同!
3 思路:將每一個(gè)單詞看成一個(gè)節(jié)點(diǎn),建立節(jié)點(diǎn)之間的無(wú)向圖!判斷是否是歐拉回路或者是歐拉路
4
5 并查集判通 + 奇度節(jié)點(diǎn)個(gè)數(shù)等于2或者0
6 */
7 #include<cstring>
8 #include<cstdio>
9 #include<algorithm>
10 #define N 2500005*2
11 using namespace std;
12
13 int f[N];
14 int trie[N][26];
15 int rank[N];
16 int deg[N];
17
18 int getFather(int x){
19 return x==f[x] ? x : f[x]=getFather(f[x]);
20 }
21
22 void Union(int a, int b){
23 int fa=getFather(a), fb=getFather(b);
24 if(fa!=fb){
25 if(rank[fa]>rank[fb]){
26 rank[fa]+=rank[fb]+1;
27 f[fb]=fa;
28 }
29 else{
30 f[fa]=fb;
31 rank[fb]+=rank[fa]+1;
32 }
33 }
34 }
35
36 int main(){
37 int cnt=0, c=0, cur=0;
38 int u, v;
39 char ch[15];
40 for(int i=1; i<N; ++i)
41 f[i]=i;
42 while(scanf("%s", ch)!=EOF){
43 ++c;
44 cur=0;
45 for(int i=0; ch[i]; ++i){
46 if(!trie[cur][ch[i]-'a'])
47 trie[cur][ch[i]-'a']=++cnt;
48 cur=trie[cur][ch[i]-'a'];
49 }
50 if(c&1) u=cur;
51 else v=cur;
52
53 if((c&1)==0){
54 Union(u, v);
55 ++deg[u];
56 ++deg[v];
57 }
58 }
59 int rootN=0, degN=0;
60 for(int i=1; i<=cnt; ++i){
61 if(deg[i] && f[i]==i) ++rootN;
62 if(deg[i]&1) ++degN;
63 if(rootN>1 || degN>2) break;
64 }
65 if(rootN==1 && (degN==0 || degN==2) || rootN==0 && degN==0)
66 printf("Possible\n");
67 else printf("Impossible\n");
68 return 0;
69 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/3922611.html
總結(jié)
以上是生活随笔為你收集整理的poj2513Colored Sticks(无向图的欧拉回路)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php实现直播答题系统,直播答题解决方案
- 下一篇: 为什么王丙怀的白酒品质这么好?