# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
145751 | letrongdat | 경찰관과 강도 (BOI14_coprobber) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "coprobber.h"
#include <bits/stdc++.h>
const int maxN = 510;
using namespace std;
#define forn(i, a, b) for(int i=a; i<=b; ++i)
#define repn(i, a, b) for(int i=a; i <b; ++i)
int cur;
int mov[maxN][maxN], deg[maxN][maxN];
int W[maxN][maxN][2];
int start(int N, bool A[maxN][maxN]) {
queue < tuple < int, int, int > > q;
repn(i, 0, N) repn(j, 0, N) repn(k, 0, N) deg[i][j] += A[j][k];
repn(i, 0, N) forn(turn, 0, 1) {
W[i][i][turn] = 1;
q.push({i, i, turn});
}
while (q.size()) {
int c, r, t;
tie(c, r, t) = q.front();
q.pop();
repn(i, 0, N) {
if (t) {
if (A[c][i] || i == c && !W[i][r][0]) {
mov[i][r] = c;
W[i][r][0] = true;
q.push({i, r, 0});
}
continue;
}
if (A[r][i] && !W[c][i][1] && --deg[c][i] < 1) {
W[c][i][1] = true;
q.push({c, i, 1});
}
}
}
bool ok = true;
repn(i, 0, N) ok &= W[0][i][0];
return (ok ? 0 : -1);
}
int next(int R) {
return cur = mov[cur][R];
}