/* TriangleEasy (SRM 693, D2, 250 from Topcoder). James S. Plank Sat Sep 17 11:10:03 EDT 2016 */ #include #include #include #include #include using namespace std; class TriangleEasy { public: int find(int n, vector x, vector y); }; int TriangleEasy::find(int n, vector x, vector y) { int i, j, k; vector < vector > A; int edges_needed; /* First, create the adjacency matrix. For each x[i]/y[i], I put two entries into A -- one for the edge from x[i] to y[i], and one for the edge from y[i] to x[i]. */ A.resize(n); for (i = 0; i < A.size(); i++) A[i].resize(n, 0); for (i = 0; i < x.size(); i++) { A[x[i]][y[i]] = 1; A[y[i]][x[i]] = 1; } /* Now enumerate all possible i, j and k. */ edges_needed = 3; for (i = 0; i < A.size(); i++) { for (j = 0; j < A.size(); j++) { for (k = 0; k < A.size(); k++) { /* Do the tests outlined in the notes, to figure out how many edges are needed for the triangle i,j,k, and if that's less then the current best, then update the current best. */ if (A[i][j] && A[j][k] && A[k][i]) return 0; if (A[i][j] && A[j][k] && edges_needed > 1) edges_needed = 1; if (A[i][j] && edges_needed > 2) edges_needed = 2; } } } return edges_needed; }