poj 2337(欧拉图)

欧拉回路相关定理: 

1 无向图为欧拉图,当且仅当为连通图且所有顶点的度为偶数。 

2 无向图为半欧拉图(存在欧拉通路),当且仅当为连通图且除了两个顶点的度为奇数之外,其它所有顶点的度为偶数。 

3 有向图为欧拉图,当且仅当的基图连通,且所有顶点的入度等于出度。(忽略有向图所有边 的方向,得到的无向图称为该有向图的基图。) 

4 有向图为半欧拉图,当且仅当的基图连通,且存在顶点的入度比出度大1、的入度比出度小1,其它所有顶点的入度等于出度。

这道题与sgu101挺相似的。。

输出字典序的问题可以由dfs过程看出。假如事先把边按字典序排好序,输出后的欧拉通路每条边依然是字典序的。

  1 // File Name: 2337.cpp
  2 // Author: Missa
  3 // Created Time: 2013/3/4 星期一 17:42:13
  4 
  5 #include<iostream>
  6 #include<cstdio>
  7 #include<cstring>
  8 #include<algorithm>
  9 #include<cmath>
 10 #include<queue>
 11 #include<stack>
 12 #include<string>
 13 #include<vector>
 14 #include<cstdlib>
 15 #include<map>
 16 #include<set>
 17 using namespace std;
 18 #define CL(x,v) memset(x,v,sizeof(x));
 19 #define R(i,st,en) for(int i=st;i<en;i++)
 20 
 21 const int maxn = 1e3+5;
 22 struct Str
 23 {
 24     char str[25];
 25 }s[maxn];
 26 bool cmp(const Str &a,const Str &b)
 27 {
 28     return strcmp(a.str,b.str)<0;
 29 }
 30 int n;
 31 struct node
 32 {
 33     int v;
 34     int id;
 35     node(){}
 36     node(int v,int id):v(v),id(id){}
 37 };
 38 vector<node>vv[26];
 39 vector<int>ans;
 40 bool vis[maxn];
 41 int deg[26];
 42 void dfs(int st)
 43 {
 44     R(i,0,vv[st].size())
 45     {
 46         node nt=vv[st][i];
 47         if(vis[nt.id]) continue;
 48         vis[nt.id]=1;
 49         dfs(nt.v);
 50         ans.push_back(nt.id);
 51     }
 52 }
 53 int main()
 54 {
 55     int t;
 56     scanf("%d",&t);
 57     while(t--)
 58     {
 59         scanf("%d",&n);
 60         CL(s,0);
 61         CL(deg,0);
 62         R(i,0,n)
 63             scanf("%s",&s[i].str);
 64         sort(s,s+n,cmp);
 65         CL(vv,0);
 66         ans.clear();
 67         CL(vis,0);
 68         R(i,0,n)
 69         {
 70             int len=strlen(s[i].str);
 71             vv[s[i].str[0]-'a'].push_back(node(s[i].str[len-1]-'a',i));
 72             deg[s[i].str[len-1]-'a']++;
 73         }
 74         int st=-1,cnt=0,en=-1;
 75         bool flag=0;
 76         R(i,0,26)
 77         {
 78             if(abs((int)vv[i].size()-(int)deg[i])>1)
 79             {
 80                 flag=1;
 81                 break;
 82             }
 83             if(vv[i].size()!=deg[i])
 84             {
 85                 cnt++;
 86                 if(st==-1 && vv[i].size()-1==deg[i])
 87                     st=i;
 88                 else if(en==-1 && vv[i].size()+1==deg[i])
 89                     en=i;
 90                 else 
 91                 {
 92                     flag=1;
 93                     break;
 94                 }
 95             }
 96         }
 97         if(flag ||(cnt!=0 && cnt !=2))
 98         {
 99             puts("***");
100             continue;
101         }
102         if(st==-1)
103             R(i,0,26)
104             {
105                 if(vv[i].size()>0)
106                 {
107                     st=i;
108                     break;
109                 }
110             }
111         dfs(st);
112         if(ans.size() != n)
113             puts("***");
114         else
115         {
116             int i=n-1;
117             printf("%s",s[ans[i]].str);
118             for(i=n-2;i>=0;i--)
119                 printf(".%s",s[ans[i]].str);
120             printf("\n");
121         }
122     }
123     return 0;
124 }

 

posted @ 2013-03-04 23:03  Missa  阅读(451)  评论(0编辑  收藏  举报