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 }

 

你可能感兴趣的:(color)