QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#864879 | #4809. Maximum Range | Misty7 | WA | 143ms | 41364kb | C++20 | 8.1kb | 2025-01-21 10:33:26 | 2025-01-21 10:33:26 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
std::set<std::pair<int, int>> E;
struct EBCC {
int n;
std::vector<std::vector<int>> adj;
std::vector<int> stk;
std::vector<int> dfn, low, bel;
int cur, cnt;
EBCC() {}
EBCC(int n) {
init(n);
}
void init(int n) {
this->n = n;
adj.assign(n, {});
dfn.assign(n, -1);
low.resize(n);
bel.assign(n, -1);
stk.clear();
cur = cnt = 0;
}
void addEdge(int u, int v) {
adj[u].push_back(v);
adj[v].push_back(u);
}
void dfs(int x, int p) {
dfn[x] = low[x] = cur++;
stk.push_back(x);
for (auto y : adj[x]) {
if (y == p) {
continue;
}
if (dfn[y] == -1) {
E.emplace(x, y);
dfs(y, x);
low[x] = std::min(low[x], low[y]);
} else if (bel[y] == -1 && dfn[y] < dfn[x]) {
E.emplace(x, y);
low[x] = std::min(low[x], dfn[y]);
}
}
if (dfn[x] == low[x]) {
int y;
do {
y = stk.back();
bel[y] = cnt;
stk.pop_back();
} while (y != x);
cnt++;
}
}
std::vector<int> work() {
dfs(0, -1);
return bel;
}
struct Graph {
int n;
std::vector<std::pair<int, int>> edges;
std::vector<int> siz;
std::vector<int> cnte;
};
Graph compress() {
Graph g;
g.n = cnt;
g.siz.resize(cnt);
g.cnte.resize(cnt);
for (int i = 0; i < n; i++) {
g.siz[bel[i]]++;
for (auto j : adj[i]) {
if (bel[i] < bel[j]) {
g.edges.emplace_back(bel[i], bel[j]);
} else if (i < j) {
g.cnte[bel[i]]++;
}
}
}
return g;
}
};
template<class T>
struct MaxFlow {
struct _Edge {
int to;
T cap;
_Edge(int to, T cap) : to(to), cap(cap) {}
};
int n;
std::vector<_Edge> e;
std::vector<std::vector<int>> g;
std::vector<int> cur, h;
MaxFlow() {}
MaxFlow(int n) {
init(n);
}
void init(int n) {
this->n = n;
e.clear();
g.assign(n, {});
cur.resize(n);
h.resize(n);
}
bool bfs(int s, int t) {
h.assign(n, -1);
std::queue<int> que;
h[s] = 0;
que.push(s);
while (!que.empty()) {
const int u = que.front();
que.pop();
for (int i : g[u]) {
auto [v, c] = e[i];
if (c > 0 && h[v] == -1) {
h[v] = h[u] + 1;
if (v == t) {
return true;
}
que.push(v);
}
}
}
return false;
}
T dfs(int u, int t, T f) {
if (u == t) {
return f;
}
auto r = f;
for (int &i = cur[u]; i < int(g[u].size()); ++i) {
const int j = g[u][i];
auto [v, c] = e[j];
if (c > 0 && h[v] == h[u] + 1) {
auto a = dfs(v, t, std::min(r, c));
e[j].cap -= a;
e[j ^ 1].cap += a;
r -= a;
if (r == 0) {
return f;
}
}
}
return f - r;
}
void addEdge(int u, int v, T c) {
g[u].push_back(e.size());
e.emplace_back(v, c);
g[v].push_back(e.size());
e.emplace_back(u, 0);
}
void addEdgeDir(int u, int v, T c) {
g[u].push_back(e.size());
e.emplace_back(v, c);
g[v].push_back(e.size());
e.emplace_back(u, c);
}
T flow(int s, int t) {
T ans = 0;
while (bfs(s, t)) {
cur.assign(n, 0);
ans += dfs(s, t, std::numeric_limits<T>::max());
}
return ans;
}
std::vector<bool> minCut() {
std::vector<bool> c(n);
for (int i = 0; i < n; i++) {
c[i] = (h[i] != -1);
}
return c;
}
struct Edge {
int from;
int to;
T cap;
T flow;
};
std::vector<Edge> edges() {
std::vector<Edge> a;
for (int i = 0; i < e.size(); i += 2) {
Edge x;
x.from = e[i + 1].to;
x.to = e[i].to;
x.cap = e[i].cap + e[i + 1].cap;
x.flow = e[i + 1].cap;
a.push_back(x);
}
return a;
}
};
constexpr int inf = 1E9 + 1;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m;
std::cin >> n >> m;
EBCC ebcc(n);
std::vector<std::map<int, int>> mp(n);
for (int i = 0; i < m; i++) {
int x, y, w;
std::cin >> x >> y >> w;
x--, y--;
ebcc.addEdge(x, y);
mp[x][y] = mp[y][x] = w;
}
ebcc.work();
std::vector<int> mina(n, -1), minb(n, -1), maxa(n, -1), maxb(n, -1);
std::vector<int> mine(n, inf), maxe(n, -inf);
for (int i = 0; i < n; i++) {
for (auto [j, w] : mp[i]) {
if (ebcc.bel[i] == ebcc.bel[j]) {
if (w < mine[ebcc.bel[i]]) {
mine[ebcc.bel[i]] = w;
mina[ebcc.bel[i]] = i;
minb[ebcc.bel[i]] = j;
}
if (w > maxe[ebcc.bel[i]]) {
maxe[ebcc.bel[i]] = w;
maxa[ebcc.bel[i]] = i;
maxb[ebcc.bel[i]] = j;
}
}
}
}
int best = -1;
for (int i = 0; i < n; i++) {
if (best == -1 || maxe[i] - mine[i] >= maxe[best] - mine[best]) {
best = i;
}
}
MaxFlow<int> flow(n + 2);
int s = n, t = s + 1;
for (int i = 0; i < n; i++) {
for (int j : ebcc.adj[i]) {
if ((i == maxa[best] && j == maxb[best]) || (i == mina[best] && j == minb[best])) {
continue;
}
if ((i == maxb[best] && j == maxa[best]) || (i == minb[best] && j == mina[best])) {
continue;
}
if (ebcc.bel[i] == best && ebcc.bel[j] == best && i < j) {
// std::cerr << i << " " << j << "\n";
flow.addEdgeDir(i, j, 1);
}
}
}
flow.addEdge(s, mina[best], 1);
flow.addEdge(s, minb[best], 1);
flow.addEdge(maxa[best], t, 1);
flow.addEdge(maxb[best], t, 1);
int fl = flow.flow(s, t);
assert(fl == 2);
auto edges = flow.edges();
std::vector<std::vector<int>> adj(n);
for (auto [from, to, cap, flow] : edges) {
if (flow == cap && from != s && to != t) {
adj[from].push_back(to);
adj[to].push_back(from);
if (n >= 50000) {
std::cerr << from << " " << to << "\n";
}
}
}
adj[mina[best]].push_back(minb[best]);
adj[minb[best]].push_back(mina[best]);
// std::cerr << mina[best] << " " << minb[best] << "\n";
adj[maxa[best]].push_back(maxb[best]);
adj[maxb[best]].push_back(maxa[best]);
// std::cerr << maxa[best] << " " << maxb[best] << "\n";
std::vector<std::map<int, int>> vis(n);
std::vector<int> stk;
auto dfs = [&](auto &&self, int x) -> void {
for (int y : adj[x]) {
if (vis[x][y]) {
continue;
}
vis[x][y] = vis[y][x] = 1;
self(self, y);
}
stk.push_back(x);
};
dfs(dfs, mina[best]);
std::cout << maxe[best] - mine[best] << "\n";
std::cout << stk.size() << "\n";
for (int i = 0; i < stk.size(); i++) {
std::cout << stk[i] + 1 << " \n"[i == stk.size() - 1];
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3712kb
input:
5 7 1 2 1 1 3 -2 2 3 1 3 4 3 4 5 1 1 5 -1 2 5 2
output:
5 4 5 4 3 1
result:
ok ok
Test #2:
score: -100
Wrong Answer
time: 143ms
memory: 41364kb
input:
99997 100000 12238 99016 352755196 99016 25485 -412473602 25485 2440 991507552 2440 31171 -181894654 36970 2440 -800167579 2440 41865 -148191946 96629 31171 847888506 36970 95740 395546542 27992 2440 647886610 99016 29557 369124914 80795 27992 -673871966 36970 3509 573208857 57672 29557 874406776 41...
output:
1959330954 2 95092 31171
result:
wrong answer Cycle contains repeated edge 31171-95092