这是一道欧拉回路题
欧拉回路:就是一个路径包括每条边恰好一次。
判断是否满足欧拉回路。首先是图是联通的。其次图中每个点的入度等于出度。如果是欧拉路径的话,满足奇点只能等于2或0,并且对于有向图,奇点的入度和出度差值为1和-1。
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include <algorithm> 7 #include <fstream> 8 #include <cstdio> 9 #include <cmath> 10 #include <stack> 11 #include <queue> 12 using namespace std; 13 const double Pi=3.14159265358979323846; 14 typedef long long ll; 15 const int MAXN=5000+5; 16 const int dx[5]={0,0,1,-1}; 17 const int dy[5]={1,-1,0,0}; 18 const int INF = 0x3f3f3f3f; 19 const int NINF = 0xc0c0c0c0; 20 int t; 21 int in[MAXN]; 22 int out[MAXN]; 23 int mp[MAXN][MAXN]; 24 bool vis1[MAXN]; 25 bool vis2[MAXN]; 26 27 bool dfs(int v,vector <int> S) 28 { 29 for(int i=0;i<S.size();i++) 30 { 31 if(!vis2[S[i]]&&mp[v][S[i]]) 32 { 33 vis2[S[i]]=1; 34 dfs(S[i],S); 35 } 36 } 37 } 38 int main() 39 { 40 cin>>t; 41 while(t--) 42 { 43 44 memset(vis1,0,sizeof(vis1)); 45 memset(vis2,0,sizeof(vis2)); 46 memset(in,0,sizeof(in)); 47 memset(out,0,sizeof(out)); 48 memset(mp,0,sizeof(mp)); 49 int n;scanf("%d",&n); 50 vector <int> S; 51 for(int i=1;i<=n;i++) 52 { 53 string str;cin>>str; 54 int len=str.size(); 55 int inc=str[0]-'a'; 56 int outc=str[len-1]-'a'; 57 mp[inc][outc]=1; 58 vis1[inc]=1;vis1[outc]=1; 59 in[inc]++; 60 out[outc]++; 61 } 62 for(int i=0;i<26;i++) if(vis1[i]) {S.push_back(i);} 63 64 vector <int> V; 65 for(int i=0;i<26;i++) 66 { 67 if(in[i]!=out[i]) V.push_back(i); 68 } 69 vis2[S[0]]=1; 70 dfs(S[0],S); 71 int flag=1; 72 for(int i=0;i<26;i++) cout <<vis1[i]<<" "; 73 cout <<endl; 74 for(int i=0;i<26;i++) cout <<vis2[i]<<" "; 75 cout <<endl; 76 for(int i=0;i<26;i++) 77 { 78 if(vis1[i]!=vis2[i]) 79 { 80 flag=0; 81 break; 82 } 83 } 84 if(!flag) 85 printf("The door cannot be opened.\n"); 86 else 87 { 88 if(V.size()==2) 89 { 90 if((out[V[0]]-in[V[0]])==(in[V[1]]-out[V[1]])&&abs(out[V[0]]-in[V[0]])==1) 91 { 92 printf("Ordering is possible.\n"); 93 } 94 else printf("The door cannot be opened.\n"); 95 } 96 97 else printf("The door cannot be opened.\n"); 98 } 99 } 100 return 0; 101 } 102 103