#include #include #include #include using namespace std; struct Graph{ int v; int e; vector> adj; vector 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 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; }