题意 给你一些单词,问你它们能否排成头尾字母相同的序列。
思路 字母作为点,一个单词作为一条边建有向图,判断图的连通性和有向图是否有欧拉通路
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxm = 100005;
const int maxn = 26;
int n,m;
int ru[maxn];
int chu[maxn];
int mapp[maxn];
int fa[maxn];
int ra[maxn];
char str[1003];
void init()
{
int i;
memset(ra,0,sizeof(ra));
memset(chu,0,sizeof(chu));
memset(ru,0,sizeof(ru));
n = 0;
memset(mapp,-1,sizeof(mapp));
for(i=0;i<maxn;i++)
fa[i] = i;
}
int find(int x)
{
if(fa[x] == x)
return x;
else
return fa[x] = find(fa[x]);
}
void unite(int x,int y)
{
x = find(x);
y = find(y);
if(x==y)
return;
if(ra[y] < ra[x])
{
fa[y] = x;
}
else if(ra[y] > ra[x])
{
fa[x] = y;
}
else
{
fa[x] = y;
ra[y]++;
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d",&m);
init();
getchar();
int i;
for(i=0;i<m;i++)
{
int u,v;
gets(str);
u = mapp[str[0]-'a'];
if(u == -1)
mapp[str[0]-'a'] = n++;
u = mapp[str[0]-'a'];
v = mapp[str[strlen(str)-1]-'a'];
if(v == -1)
mapp[str[strlen(str)-1]-'a'] = n++;
v = mapp[str[strlen(str)-1]-'a'];
unite(u,v);
ru[v]++;
chu[u]++;
}
for(i=1;i<n;i++)
{
if(find(i-1) != find(i))
{
puts("The door cannot be opened.");
break;
}
}
if(i < n)
continue;
bool flag1 = 0;
bool flag2 = 0;
for(i=0;i<n;i++)
{
if(ru[i] == chu[i])
{
continue;
}
if(ru[i] - chu[i] == 1 && flag1 == 0)
{
flag1 = 1;
continue;
}
if(ru[i] - chu[i] == -1 && flag2 == 0)
{
flag2 = 1;
continue;
}
puts("The door cannot be opened.");
break;
}
if(i < n)
continue;
puts("Ordering is possible.");
}
return 0;
}