题目链接
无向图
欧拉回路 所有点均为偶度顶点(顶点度数为偶数)
欧拉通路 最多仅2个点为奇度顶点(顶点度数为奇数)
有向图
欧拉回路 所有点出度=入度
欧拉通路 最多两个点出度!=入度;其中一个出度比入度大1;另一个入度比出度大1
因此解决思路如下:
连通图判定:并查集或者dfs均可
顶点出入度:用degree[i]记录每个点的出入度结果,出则-1,入则+1,结果为0表示出入度相同
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<set>
#include<cmath>
#include<stack>
#include<map>
#include<queue>
#include<sstream>
using namespace std;
#define maxn 105
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
int der[30];
int vis[30];
int fa[30];
void init()
{
for(int i=0;i<26;i++)
{
fa[i]=i;
vis[i]=0;
der[i]=0;
}
}
int found(int m)
{
if(fa[m]==m)return m;
else return fa[m]=found(fa[m]);
}
void together(int u,int v)
{
int fu=found(u);
int fv=found(v);
if(fu!=fv)fa[fu]=fv;
}
int main()
{
int t,n,ok;
string str;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init();
ok=0;
for(int i=0;i<n;i++)
{
cin>>str;
der[str[0]-'a']--;
der[str[str.size()-1]-'a']++;
together(str[0]-'a',str[str.size()-1]-'a');
vis[str[0]-'a']=1;
vis[str[str.size()-1]-'a']=1;
}
for(int i=0;i<26;i++)
if(vis[i]&&fa[i]==i)ok++;
if(ok>1)printf("The door cannot be opened.\n");
else {
int cnt=0,ep=0,xp=0;
for(int i=0;i<26;i++)
{
if(!der[i])cnt++;
if(der[i]==-1)ep++;
if(der[i]==1)xp++;
}
if(cnt==26)printf("Ordering is possible.\n");
else if(cnt==24&&ep==1&&xp==1)printf("Ordering is possible.\n");
else printf("The door cannot be opened.\n");
}
}
}