제출 #1342065

#제출 시각아이디문제언어결과실행 시간메모리
1342065yuqzii경찰관과 강도 (BOI14_coprobber)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int MAXN = 500;
constexpr int INF = 1e6;

int n;
int p = 0;
array<array<bool, MAXN>, MAXN> a;
array<int, MAXN> parent, t;

int start(int N, bool A[MAXN][MAXN]) {
	n = N;

	vector<bitset<MAXN>> b(n);
	for (int u = 0; u < n; u++) {
		for (int v = 0; v < n; v++) {
			a[u][v] = A[u][v];
			b[u][v] = a[u][v];
		}
		b[u][u] = 1;
	}

	vector<bool> removed(n);
	bool changed = true;
	int timer = 0;
	while (changed) {
		changed = false;
		for (int u = 0; u < n; u++) {
			if (removed[u]) continue;
			for (int v = 0; v < n; v++) {
				if (u == v || removed[v]) continue;
				if ((b[u] & b[v]) == b[u]) {
					removed[u] = true;
					parent[u] = v;
					changed = true;
					t[u] = timer++;
					for (int w = 0; w < n; w++) {
						b[w][u] = 0;
					}
					break;
				}
			}
			if (changed) break;
		}
	}

	p = -1;
	for (int u = 0; u < n; u++) if (!removed[u]) {
		p = u;
		t[u] = timer;
		break;
	}
	
	return p;
}

int nextMove(int r) {
	if (a[p][r] || p == r) return p = r;

	int pr = r;
	while (t[pr] < t[p])
		pr = parent[pr];

	return p = pr;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...