81 lines
1.4 KiB
C++
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;
|
|
}
|