UVA-10129 Play on Words

来源:互联网 发布:胸肌下轮廓 知乎 编辑:程序博客网 时间:2024/05/22 14:46

题目链接:https://vjudge.net/problem/UVA-10129

输入的字符串首尾相连,可以看成一个26个字母组成的有向图,如果可以找到一条欧拉通路,则有解

先判断出入度是否符合,再判断是否连通,都满足则有欧拉通路

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;const int N=1e5+10;int n;bool g[26][26];bool vis[26],vis0[26];int num[26];void dfs(int u){vis[u]=true;for(int i=0;i<26;i++){if(g[u][i]&&!vis[i])dfs(i);}}bool f(){for(int i=0;i<26;i++)if(vis0[i]){memset(vis,false,sizeof(vis));dfs(i);for(int i=0;i<26;i++){if(vis0[i]!=vis[i]) break;if(i==25) return true;}}return false;}int main(){string s;int T;scanf("%d",&T);while(T--){scanf("%d",&n);memset(num,0,sizeof(num));memset(g,false,sizeof(g));memset(vis0,false,sizeof(vis0));for(int i=0;i<n;i++){cin>>s;int l=s.length();int a=s[0]-'a';int b=s[l-1]-'a';g[a][b]=true; //有向图邻接矩阵 num[a]--; //入减一 num[b]++; //出加一 vis0[a]=vis0[b]=true; //出现过此字符 }bool flag=true,in=false,out=false;for(int i=0;i<26;i++) //判断出入度 {if(num[i]>1||num[i]<-1){flag=false;break;}if(num[i]==-1){if(in){flag=false;break;}in=true;}if(num[i]==1){if(out){flag=false;break;}out=true;}}if(flag) flag=f(); //判断连通 if(flag) printf("Ordering is possible.\n");else printf("The door cannot be opened.\n");}return 0;}

原创粉丝点击