POJ-2513 Colored Sticks 欧拉回路

  题目链接:http://poj.org/problem?id=2513

  建立无向图,看图是否存在欧拉道路。首先判断图是否连通,可以用并查集或者一遍BFS判断,最后判断入度数就可以了。

  1 //STATUS:C++_AC_1266MS_79348KB
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<math.h>
  6 #include<iostream>
  7 #include<string>
  8 #include<algorithm>
  9 #include<vector>
 10 #include<queue>
 11 #include<stack>
 12 #include<map>
 13 using namespace std;
 14 #define LL __int64
 15 #define pii pair<int,int>
 16 #define Max(a,b) ((a)>(b)?(a):(b))
 17 #define Min(a,b) ((a)<(b)?(a):(b))
 18 #define mem(a,b) memset(a,b,sizeof(a))
 19 #define lson l,mid,rt<<1
 20 #define rson mid+1,r,rt<<1|1
 21 const int N=510000,INF=0x3f3f3f3f,MOD=1999997;
 22 const LL LLNF=0x3f3f3f3f3f3f3f3fLL;
 23 
 24 struct Node{
 25     int u,v;
 26 }e[N];
 27 struct Trie{
 28     Trie(){mem(next,0);val=0;}
 29     Trie *next[26];
 30     int val;
 31 };
 32 int num[N],first[N],next[N],vis[N];
 33 int cou,m;
 34 
 35 void adde(int a,int b)
 36 {
 37     e[m].u=a,e[m].v=b;
 38     next[m]=first[a],first[a]=m++;
 39     e[m].u=b,e[m].v=a;
 40     next[m]=first[b],first[b]=m++;
 41 }
 42 
 43 int bfs()
 44 {
 45     int i,u,v,k=1;
 46     queue<int> q;
 47     q.push(1);
 48     mem(vis,0);
 49     vis[1]=1;
 50     while(!q.empty()){
 51         u=q.front();q.pop();
 52         for(i=first[u];i!=-1;i=next[i]){
 53             if(!vis[e[i].v]){
 54                 vis[e[i].v]=1;
 55                 q.push(e[i].v);
 56                 k++;
 57             }
 58         }
 59     }
 60     return k==cou;
 61 }
 62 
 63 int build(Trie *rt,char *a)
 64 {
 65     if(*a==0){
 66         if(rt->val)num[rt->val]++;
 67         else {
 68             rt->val=++cou;
 69             num[cou]++;
 70         }
 71         return rt->val;
 72     }
 73     int idx=*a-'a';
 74     if(!rt->next[idx])
 75         rt->next[idx]=new Trie;
 76     return build(rt->next[idx],a+1);
 77 }
 78 
 79 int main()
 80 {
 81  //   freopen("in.txt","r",stdin);
 82     int i,j,ok,a,b;
 83     char s1[15],s2[15];
 84     Trie *head;
 85     head=new Trie;
 86     m=cou=0;
 87     mem(num,0);mem(first,-1);
 88     while(~scanf("%s%s",s1,s2)){
 89         a=build(head,s1);
 90         b=build(head,s2);
 91         adde(a,b);
 92     }
 93     ok=0;
 94     for(i=1;i<=cou;i++){
 95         if(num[i]&1)ok++;
 96         if(ok>2)break;
 97     }
 98     printf("%s\n",(!cou || ((ok==2 || ok==0) && bfs()))?"Possible":"Impossible");
 99     return 0;
100 }

 

posted @ 2013-01-20 00:08  zhsl  阅读(193)  评论(0编辑  收藏  举报