d02edd33e2 2018-06-03 kinaba: #include <iostream> d02edd33e2 2018-06-03 kinaba: #include <sstream> d02edd33e2 2018-06-03 kinaba: #include <iomanip> d02edd33e2 2018-06-03 kinaba: #include <vector> d02edd33e2 2018-06-03 kinaba: #include <string> d02edd33e2 2018-06-03 kinaba: #include <map> d02edd33e2 2018-06-03 kinaba: #include <set> d02edd33e2 2018-06-03 kinaba: #include <algorithm> d02edd33e2 2018-06-03 kinaba: #include <numeric> d02edd33e2 2018-06-03 kinaba: #include <iterator> d02edd33e2 2018-06-03 kinaba: #include <functional> d02edd33e2 2018-06-03 kinaba: #include <complex> d02edd33e2 2018-06-03 kinaba: #include <queue> d02edd33e2 2018-06-03 kinaba: #include <stack> d02edd33e2 2018-06-03 kinaba: #include <cmath> d02edd33e2 2018-06-03 kinaba: #include <cassert> d02edd33e2 2018-06-03 kinaba: #include <tuple> d02edd33e2 2018-06-03 kinaba: using namespace std; d02edd33e2 2018-06-03 kinaba: typedef long long LL; d02edd33e2 2018-06-03 kinaba: typedef complex<double> CMP; d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: class MakingRegularGraph { public: d02edd33e2 2018-06-03 kinaba: vector <int> addEdges(int n, vector <int> x, vector <int> y) d02edd33e2 2018-06-03 kinaba: { d02edd33e2 2018-06-03 kinaba: vector<int> deg(n); d02edd33e2 2018-06-03 kinaba: for (int i = 0; i < x.size(); ++i) d02edd33e2 2018-06-03 kinaba: deg[x[i]]++, deg[y[i]]++; d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: set<int> d0, d1; d02edd33e2 2018-06-03 kinaba: for (int v = 0; v < n; ++v) d02edd33e2 2018-06-03 kinaba: if (deg[v] == 0) d0.insert(v); d02edd33e2 2018-06-03 kinaba: else if (deg[v] == 1) d1.insert(v); d02edd33e2 2018-06-03 kinaba: map<int, int> d1e; d02edd33e2 2018-06-03 kinaba: for (int i = 0; i < x.size(); ++i) d02edd33e2 2018-06-03 kinaba: if (d1.count(x[i]) && d1.count(y[i])) { d02edd33e2 2018-06-03 kinaba: d1e[x[i]] = y[i]; d02edd33e2 2018-06-03 kinaba: d1e[y[i]] = x[i]; d02edd33e2 2018-06-03 kinaba: d1.erase(x[i]); d02edd33e2 2018-06-03 kinaba: d1.erase(y[i]); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: #define BAD (((d0.size()==1||d0.size()==2) && d1.empty() && d1e.empty()) || (d0.empty() && d1.empty() && d1e.size()==2 && d1e.begin()->first==d1e.rbegin()->second)) d02edd33e2 2018-06-03 kinaba: if(BAD) d02edd33e2 2018-06-03 kinaba: return vector<int>(1, -1); d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: vector<bool> used(n*n); d02edd33e2 2018-06-03 kinaba: for (int i = 0; i < x.size(); ++i) d02edd33e2 2018-06-03 kinaba: used[x[i] * n + y[i]] = true; d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: vector<int> ans; d02edd33e2 2018-06-03 kinaba: for(int v=0; v<n; ++v) d02edd33e2 2018-06-03 kinaba: for(int u=v+1; u<n; ++u) if(!used[v*n+u]) d02edd33e2 2018-06-03 kinaba: { d02edd33e2 2018-06-03 kinaba: if (d0.empty() && d1.empty() && d1e.empty()) d02edd33e2 2018-06-03 kinaba: break; d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: bool bad = true; d02edd33e2 2018-06-03 kinaba: if (d0.count(v)) { d02edd33e2 2018-06-03 kinaba: d0.erase(v); d02edd33e2 2018-06-03 kinaba: if (d0.count(u)) { d02edd33e2 2018-06-03 kinaba: d0.erase(u); d02edd33e2 2018-06-03 kinaba: d1e[v] = u; d02edd33e2 2018-06-03 kinaba: d1e[u] = v; d02edd33e2 2018-06-03 kinaba: if (bad=BAD) { d02edd33e2 2018-06-03 kinaba: d0.insert(u); d02edd33e2 2018-06-03 kinaba: d1e.erase(v); d02edd33e2 2018-06-03 kinaba: d1e.erase(u); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1.count(u)) { d02edd33e2 2018-06-03 kinaba: d1.erase(u); d02edd33e2 2018-06-03 kinaba: d1.insert(v); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d1.insert(u); d02edd33e2 2018-06-03 kinaba: d1.erase(v); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1e.count(u)) { d02edd33e2 2018-06-03 kinaba: int ut = d1e[u]; d1e.erase(u); d02edd33e2 2018-06-03 kinaba: d1.insert(v); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d1e[u] = ut; d02edd33e2 2018-06-03 kinaba: d1.erase(v); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: if (bad) d02edd33e2 2018-06-03 kinaba: d0.insert(v); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1.count(v)) { d02edd33e2 2018-06-03 kinaba: d1.erase(v); d02edd33e2 2018-06-03 kinaba: if (d0.count(u)) { d02edd33e2 2018-06-03 kinaba: d0.erase(u); d02edd33e2 2018-06-03 kinaba: d1.insert(u); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d0.insert(u); d02edd33e2 2018-06-03 kinaba: d1.erase(u); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1.count(u)) { d02edd33e2 2018-06-03 kinaba: d1.erase(u); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d1.insert(u); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1e.count(u)) { d02edd33e2 2018-06-03 kinaba: int ut = d1e[u]; d1e.erase(u); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d1e[u] = ut; d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: if (bad) d02edd33e2 2018-06-03 kinaba: d1.insert(v); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1e.count(v)) { d02edd33e2 2018-06-03 kinaba: int vt = d1e[v]; d1e.erase(v); d02edd33e2 2018-06-03 kinaba: if (d0.count(u)) { d02edd33e2 2018-06-03 kinaba: d0.erase(u); d02edd33e2 2018-06-03 kinaba: d1.insert(u); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d0.insert(u); d02edd33e2 2018-06-03 kinaba: d1.erase(u); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1.count(u)) { d02edd33e2 2018-06-03 kinaba: d1.erase(u); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d1.insert(u); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: else if (d1e.count(u)) { d02edd33e2 2018-06-03 kinaba: int ut = d1e[u]; d1e.erase(u); d02edd33e2 2018-06-03 kinaba: if (bad = BAD) { d02edd33e2 2018-06-03 kinaba: d1e[u] = ut; d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: if (bad) d02edd33e2 2018-06-03 kinaba: d1e[v] = vt; d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: if(!bad) d02edd33e2 2018-06-03 kinaba: ans.push_back(v), ans.push_back(u); d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: return ans; d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: }; d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: // BEGIN CUT HERE d02edd33e2 2018-06-03 kinaba: #include <ctime> d02edd33e2 2018-06-03 kinaba: double start_time; string timer() d02edd33e2 2018-06-03 kinaba: { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } d02edd33e2 2018-06-03 kinaba: template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) d02edd33e2 2018-06-03 kinaba: { os << "{ "; d02edd33e2 2018-06-03 kinaba: for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it) d02edd33e2 2018-06-03 kinaba: os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } d02edd33e2 2018-06-03 kinaba: void verify_case(const vector <int>& Expected, const vector <int>& Received) { d02edd33e2 2018-06-03 kinaba: bool ok = (Expected == Received); d02edd33e2 2018-06-03 kinaba: if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; d02edd33e2 2018-06-03 kinaba: cerr << "\to: " << Expected << endl << "\tx: " << Received << endl; } } d02edd33e2 2018-06-03 kinaba: #define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); d02edd33e2 2018-06-03 kinaba: #define END verify_case(_, MakingRegularGraph().addEdges(n, x, y));} d02edd33e2 2018-06-03 kinaba: int main(){ d02edd33e2 2018-06-03 kinaba: d02edd33e2 2018-06-03 kinaba: CASE(0) d02edd33e2 2018-06-03 kinaba: int n = 6; d02edd33e2 2018-06-03 kinaba: int x_[] = {0,2}; d02edd33e2 2018-06-03 kinaba: vector <int> x(x_, x_+sizeof(x_)/sizeof(*x_)); d02edd33e2 2018-06-03 kinaba: int y_[] = {2,3}; d02edd33e2 2018-06-03 kinaba: vector <int> y(y_, y_+sizeof(y_)/sizeof(*y_)); d02edd33e2 2018-06-03 kinaba: int __[] = {0, 1, 1, 4, 3, 5, 4, 5 }; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: CASE(1) d02edd33e2 2018-06-03 kinaba: int n = 4; d02edd33e2 2018-06-03 kinaba: int x_[] = {1,2,1}; d02edd33e2 2018-06-03 kinaba: vector <int> x(x_, x_+sizeof(x_)/sizeof(*x_)); d02edd33e2 2018-06-03 kinaba: int y_[] = {2,3,3}; d02edd33e2 2018-06-03 kinaba: vector <int> y(y_, y_+sizeof(y_)/sizeof(*y_)); d02edd33e2 2018-06-03 kinaba: int __[] = {-1 }; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: CASE(2) d02edd33e2 2018-06-03 kinaba: int n = 3; d02edd33e2 2018-06-03 kinaba: vector <int> x; d02edd33e2 2018-06-03 kinaba: vector <int> y; d02edd33e2 2018-06-03 kinaba: int __[] = {0, 1, 0, 2, 1, 2 }; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: CASE(3) d02edd33e2 2018-06-03 kinaba: int n = 5; d02edd33e2 2018-06-03 kinaba: int x_[] = {0}; d02edd33e2 2018-06-03 kinaba: vector <int> x(x_, x_+sizeof(x_)/sizeof(*x_)); d02edd33e2 2018-06-03 kinaba: int y_[] = {4}; d02edd33e2 2018-06-03 kinaba: vector <int> y(y_, y_+sizeof(y_)/sizeof(*y_)); d02edd33e2 2018-06-03 kinaba: int __[] = {0, 1, 1, 2, 2, 3, 3, 4 }; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: CASE(4) d02edd33e2 2018-06-03 kinaba: int n = 5; d02edd33e2 2018-06-03 kinaba: int x_[] = {2}; d02edd33e2 2018-06-03 kinaba: vector <int> x(x_, x_+sizeof(x_)/sizeof(*x_)); d02edd33e2 2018-06-03 kinaba: int y_[] = {3}; d02edd33e2 2018-06-03 kinaba: vector <int> y(y_, y_+sizeof(y_)/sizeof(*y_)); d02edd33e2 2018-06-03 kinaba: int __[] = {0, 1, 0, 2, 1, 4, 3, 4 }; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: /* d02edd33e2 2018-06-03 kinaba: CASE(5) d02edd33e2 2018-06-03 kinaba: int n = ; d02edd33e2 2018-06-03 kinaba: int x_[] = ; d02edd33e2 2018-06-03 kinaba: vector <int> x(x_, x_+sizeof(x_)/sizeof(*x_)); d02edd33e2 2018-06-03 kinaba: int y_[] = ; d02edd33e2 2018-06-03 kinaba: vector <int> y(y_, y_+sizeof(y_)/sizeof(*y_)); d02edd33e2 2018-06-03 kinaba: int __[] = ; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: CASE(6) d02edd33e2 2018-06-03 kinaba: int n = ; d02edd33e2 2018-06-03 kinaba: int x_[] = ; d02edd33e2 2018-06-03 kinaba: vector <int> x(x_, x_+sizeof(x_)/sizeof(*x_)); d02edd33e2 2018-06-03 kinaba: int y_[] = ; d02edd33e2 2018-06-03 kinaba: vector <int> y(y_, y_+sizeof(y_)/sizeof(*y_)); d02edd33e2 2018-06-03 kinaba: int __[] = ; d02edd33e2 2018-06-03 kinaba: vector <int> _(__, __+sizeof(__)/sizeof(*__)); d02edd33e2 2018-06-03 kinaba: END d02edd33e2 2018-06-03 kinaba: */ d02edd33e2 2018-06-03 kinaba: } d02edd33e2 2018-06-03 kinaba: // END CUT HERE