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 }