题意
n个单词,是否可以把它们排成一个序列,使得每个单词的第一个字母与前一个单词的最后一个字母相同。输入中可以有重复单词。
题解
把字母看作结点,单词看作边,那么这题便是判断构成的有向图中是否存在欧拉通路。
有向图存在欧拉通路需要满足两个条件:
1. 它的无向图连通;
2. 顶点度数满足:顶点的入度等于出度,或者有两个顶点,一个入度比出度大1,另一个出度比入度大1,其他顶点入度等于出度。
图的连通性可以用 dfs 判断,或者使用 并查集判断。
way 1
#include <bits/stdc++.h>
using namespace std;
const int maxn = 26;
int graph[maxn][maxn], g[maxn][maxn];
int in[maxn], out[maxn];
bool used[maxn];
int n, t;
void dfs(int u)
{
used[u] = true;
for(int i = 0; i < maxn; ++i)
if(g[u][i] && !used[i]){
dfs(i);
}
}
bool isDegree()
{
bool inOut = false, outIn = false;
for(int i = 0; i < maxn; ++i)
{
if(in[i] != out[i])
{
if(!inOut && in[i] == out[i] + 1) inOut = true;