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 }

 

你可能感兴趣的:(poj)