QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#416154 | #4513. Slide Parade | Whicy | 0 | 2ms | 3452kb | C++20 | 3.1kb | 2024-05-21 16:31:21 | 2024-05-21 16:31:22 |
answer
#include <cassert>
#include <iostream>
#include <ostream>
#include <vector>
int main() {
// std::ios::sync_with_stdio(0);
// std::cin.tie(nullptr);
// std::cout.tie(nullptr);
int T;
std::cin >> T;
for (int TC = 1; TC <= T; TC++) {
std::cout << "Case #" << TC << ": ";
int n, m;
std::cin >> n >> m;
std::vector<std::vector<int>> ed(n), rved(n);
for (int i = 0; i < m; i++) {
int u, v;
std::cin >> u >> v;
ed[--u].push_back(--v);
rved[v].push_back(u);
}
std::vector<bool> con1(n), con2(n);
int lst;
auto scc1 = [&](auto scc1, int u) -> void {
con1[u] = 1;
for (auto v : ed[u])
if (!con1[v])
scc1(scc1, v);
lst = u;
};
bool imp = 0;
scc1(scc1, 0);
for (int i = 0; i < n; i++) {
if (!con1[i]) {
imp = 1;
break;
}
}
auto scc2 = [&](auto scc2, int u) -> void {
con2[u] = 1;
for (auto v : rved[u])
if (!con2[v])
scc2(scc2, v);
};
scc2(scc2, lst);
for (int i = 0; i < n; i++) {
if (!con2[i]) {
imp = 1;
break;
}
}
if (imp) {
std::cout << "IMPOSSIBLE\n";
continue;
}
std::vector<int> lnk(n, -1), vis(n, 0);
auto dfs = [&](const auto &dfs, const int &u, std::vector<bool> &vis) -> bool {
for (int v : ed[u]) {
if (vis[v])
continue;
vis[v] = 1;
if (!~lnk[v] || dfs(dfs, lnk[v], vis)) {
lnk[v] = u;
return true;
}
}
return false;
};
int cnt = 0;
for (int i = 0; i < n; i++) {
std::vector<bool> vis(n, 0);
if (dfs(dfs, i, vis))
cnt++;
}
if (cnt < n) {
std::cout << "IMPOSSIBLE\n";
continue;
}
// begin
std::vector<std::vector<int>> nwed(n);
for (int u = 0; u < n; u++) {
if (imp)
break;
for (auto v : ed[u]) {
if (lnk[v] == u) {
for (int i = 0; i < n; i++) {
nwed[lnk[i]].push_back(i);
}
continue;
}
for (int i = 0; i < n; i++)
if (lnk[i] == u)
lnk[i] = -1;
int tmp = lnk[v];
lnk[v] = u;
std::vector<bool> vis(n, 0);
vis[v] = 1;
if (!dfs(dfs, tmp, vis)) {
imp = 1;
break;
}
for (int i = 0; i < n; i++) {
nwed[lnk[i]].push_back(i);
}
}
}
if (imp) {
std::cout << "IMPOSSIBLE\n";
continue;
}
// end
std::cout << n * m + 1 << "\n";
std::vector<int> ans;
auto fnd = [&](const auto &fnd, const int &u) -> void {
for (auto &x : nwed[u]) {
int v = x;
if (!~v)
continue;
x = -1;
fnd(fnd, v);
ans.push_back(u);
}
};
fnd(fnd, 0);
int st = 0;
for (; ans[st] != 0; st++)
;
for (int i = st; i < n * m; i++) {
std::cout << ans[i] + 1 << " ";
}
for (int i = 0; i < st; i++) {
std::cout << ans[i] + 1 << " ";
}
std::cout << "1\n";
}
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 3452kb
input:
100 5 8 1 2 1 3 1 4 1 5 2 1 3 1 4 1 5 1 5 10 1 3 1 4 2 3 2 5 3 1 3 4 3 5 4 2 5 1 5 3 5 10 1 4 2 3 2 5 3 1 3 5 4 2 4 3 4 5 5 1 5 2 3 6 1 2 1 3 2 1 2 3 3 1 3 2 5 10 1 2 1 5 2 3 2 4 3 1 4 3 4 5 5 2 5 3 5 4 4 10 1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 4 4 2 4 3 5 10 1 2 1 3 2 1 2 4 3 1 3 5 4 2 4 5 5 3 5 4 5 10 1 ...
output:
Case #1: IMPOSSIBLE Case #2: 51 1 5 3 2 4 1 5 3 2 4 1 5 3 2 4 1 5 2 4 3 1 3 5 2 4 1 3 5 2 4 1 5 3 2 4 1 3 5 2 4 1 5 2 4 3 1 3 5 2 4 1 Case #3: 51 1 5 2 5 3 2 4 1 3 2 5 2 5 4 1 3 4 1 5 3 2 4 1 5 3 2 5 2 5 2 4 1 3 4 1 3 4 1 5 3 2 4 1 5 3 2 4 1 3 4 1 Case #4: 19 1 3 2 1 3 2 1 2 3 1 2 3 1 3 2 1 2 3 1 Ca...
result:
wrong answer invalid move (from 1 to 5) (test case 2)
Test #2:
score: 0
Time Limit Exceeded
input:
100 199 4980 1 95 1 96 1 105 1 124 1 130 1 131 1 135 1 137 1 139 1 140 1 141 1 147 1 155 1 172 1 174 1 179 1 183 1 188 1 193 1 196 1 197 2 3 2 5 2 13 2 14 2 17 2 20 2 24 2 26 2 30 2 41 2 44 2 45 2 52 2 56 2 67 2 70 2 71 2 74 2 78 2 84 2 85 2 90 2 92 2 93 2 97 2 107 2 111 2 113 2 122 2 124 2 128 2 13...
output:
Case #1: IMPOSSIBLE Case #2: IMPOSSIBLE Case #3: 1000001 1 108 137 133 152 58 114 102 121 200 199 13 190 176 72 138 46 62 12 83 129 68 175 119 56 132 163 95 188 14 103 187 141 117 112 76 120 37 32 50 92 162 184 33 130 48 100 23 127 94 147 21 174 156 181 192 143 49 167 16 195 43 195 43 39 89 115 99 1...