UVa10129(还没ac)各种re,o(╥﹏╥)o

这是一道欧拉回路题

欧拉回路:就是一个路径包括每条边恰好一次。

判断是否满足欧拉回路。首先是图是联通的。其次图中每个点的入度等于出度。如果是欧拉路径的话,满足奇点只能等于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  

 

posted @ 2019-04-08 17:22  Chuhanjing  阅读(143)  评论(0编辑  收藏  举报