Files
Data-Structure/Algorithm/DS-Related/Graph/EulerGraph/UVa-10129-PlayOnWords.cpp
2025-08-31 10:21:06 +08:00

81 lines
1.4 KiB
C++

#include <iostream>
#include <vector>
#include <deque>
#include <string>
using namespace std;
struct Graph{
int v;
int e;
vector<vector<int>> adj;
vector<bool> visited;
Graph(int _v) : v(_v) {
adj.resize(v);
visited.assign(v, false);
}
bool validateV(int _v){
return ( _v >= 0 && _v < v);
}
void insert(int _a, int _b){
if(!validateV(_a) || !validateV(_b)) return;
adj[_a].push_back(_b);
}
int degree(int _v){
if(!validateV(_v)) return 0;
return outDegree(_v) + inDegree(_v);
}
int outDegree(int _v){
if(!validateV(_v)) return 0;
return adj[_v].size();
}
int inDegree(int _v){
if(!validateV(_v)) return 0;
int js = 0;
for(auto x : adj){
for(int i = 0; i < x.size(); i++){
if(x[i] == _v) js++;
}
}
return js;
}
void dfs(int _v){
if(!validateV(_v)) return;
if(visited[_v]) return;
visited[_v] = true;
for(auto x : adj[_v]){
dfs(x);
}
}
bool isConnected(){
dfs(0);
for(auto x : visited){
if(!x) return false;
}
int js = 0;
for(int i = 0; i < v; i++){
if(degree(i) % 2 == 1) js++;
}
return (js == 0) || (js == 2);
}
};
int main(){
int n;
cin >> n;
Graph g(n);
vector<string> s;
s.resize(n);
for(int i = 0; i < n; i++){
cin >> s[i];
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i != j && s[i].back() == s[j].front()) g.insert(i, j);
}
}
g.isConnected() ? cout << "YES" << endl : cout << "NO" << endl;
system("pause");
return 0;
}