1 条题解
-
0
#include <bits/stdc++.h> #include "coprobber.h" using namespace std; const int MAXN = 510; int n, id[MAXN][MAXN][2], tot, val[MAXN][MAXN][2], hd, tl, deg[MAXN]; int num[MAXN][MAXN][2], now, nxt[MAXN][MAXN]; tuple<int, int, int> qu[MAXN * MAXN * 2]; vector<int> g[MAXN]; int start(int _n, bool a[MAX_N][MAX_N]) { n = _n; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(a[i-1][j-1])g[i].push_back(j); for(int i=1;i<=n;++i) for(int j=0;j<2;++j) val[i][i][j]=1,qu[++tl]=make_tuple(i,i,j); hd = 1; while (hd <= tl) { int u, v, d; tie(u, v, d) = qu[hd++]; if (!d) { for (auto w : g[v]) { if (++num[u][w][1] == (int)g[w].size()) { val[u][w][1] = 1; qu[++tl] = {u, w, 1}; } } } else { if (!val[u][v][0]) { val[u][v][0] = 1; nxt[u][v] = u; qu[++tl] = {u, v, 0}; } for (auto w : g[u]) { if (val[w][v][0]) continue; val[w][v][0] = 1; nxt[w][v] = u; qu[++tl] = {w, v, 0}; } } } for (int i = 1; i <= n; ++i) { bool flag = false; for (int j = 1; j <= n; ++j) { if (!val[i][j][0]) { flag = true; break; } } if (!flag) { now = i; return i - 1; } } return -1; } int nextMove(int r) { now = nxt[now][r + 1]; return now - 1; }
- 1
信息
- ID
- 10557
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者