链接:点击打开链接
题意:给出一些单词看能否首位相接
代码:
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
char s[1005];
int vis[30],deg[30];
vector<int> G[30];
void dfs(int S){
int i,u;
vis[S]=0;
for(i=0;i<G[S].size();i++){
u=G[S][i];
if(vis[u])
dfs(u);
}
}
int main(){
int t,n,i,j,u,v,op,ans,sig;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
memset(deg,0,sizeof(deg));
memset(vis,0,sizeof(vis));
for(i=0;i<30;i++)
G[i].clear();
for(i=1;i<=n;i++){ //把每一条边看做一个单词,而不能
scanf("%s",s); //把每一个单词看做一个点,因为看做
u=s[0]-'a'; //一个点的话则变为求哈密顿路,是没有
v=s[strlen(s)-1]-'a'; //效率很高的判断方式的
deg[u]--,deg[v]++; //出度减一入度加一
G[u].push_back(v); //有向图无奇度点为存在欧拉回路
G[v].push_back(u); //仅有两个点入度-出度=1或-1存在欧拉通路
vis[u]=vis[v]=1;
}
for(i=0;i<26;i++){
if(vis[i]){
dfs(i);
break;
}
}
sig=1;
for(i=0;i<26;i++){
if(vis[i]){
sig=0;
break;
}
}
if(sig==0){ //判断图是否有孤立点
puts("The door cannot be opened.");
continue;
}
op=ans=0;
for(i=0;i<26;i++){
if(deg[i]!=0){
if(deg[i]!=-1&°[i]!=1){ //判断入度-出度是否不是0或1或-1
sig=0;
break;
}
op++,ans+=deg[i];
}
}
if(sig==0)
puts("The door cannot be opened.");
else if(op==1||op>2)
puts("The door cannot be opened.");
else if(op==0) //存在欧拉回路
puts("Ordering is possible.");
else{
if(ans==0) //存在欧拉通路
puts("Ordering is possible.");
else
puts("The door cannot be opened.");
}
}
return 0;
}