// [NWERC'14] Orienteering, by Jan Kuipers #include #include #include #include using namespace std; int N; long long L; vector > d; int bit_count(int msk) { int cnt=0; while (msk > 0) { if (msk & 1) cnt++; msk >>= 1; } return cnt; } set get_distances(int start, int mask, int end) { vector x; set distances; if (mask == 0) { distances.insert(d[start][end]); return distances; } for (int i=0; i> N >> L; d = vector >(N, vector(N)); for (int i=0; i> d[i][j]; } } bool possible = false; for (int center=1; center distances_left = get_distances(0, mask_left, center); set distances_right = get_distances(center, mask_right, 0); for (set::iterator it = distances_left.begin(); it != distances_left.end(); it++) { if (distances_right.find(L - *it) != distances_right.end()) { possible = true; } } } } cout << (possible ? "possible" : "impossible") << endl; return 0; }