QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#643865 | #2289. Jail or Joyride | wlz | WA | 0ms | 3572kb | C++20 | 3.8kb | 2024-10-16 03:30:26 | 2024-10-16 03:30:27 |
Judging History
answer
#ifndef DEBUG
#pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#endif
#include <bits/stdc++.h>
using namespace std;
#ifdef DEBUG
#include "debug.hpp"
#else
#define debug(...)
#endif
#define rep(i, a, b) for (auto i = a; i < (b); ++i)
#define repr(i, a, b) for (auto i = (a) - 1; i >= (b); --i)
#define pb push_back
#define eb emplace_back
#define all(x) begin(x), end(x)
#define sz(x) int((x).size())
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using vii = vector<pii>;
template<class T> inline bool cmax(T &a, const T &b)
{ return a < b ? a = b, 1 : 0; }
template<class T> inline bool cmin(T &a, const T &b)
{ return b < a ? a = b, 1 : 0; }
const int inf = 0x3f3f3f3f;
const ll linf = 1e18;
const double dinf = numeric_limits<double>::infinity();
int main() {
cin.tie(0)->sync_with_stdio(0);
cin.exceptions(cin.failbit);
int n, m, p, t;
cin >> n >> m >> p >> t;
vector< vector< pair<int, ll> > > g(n + 1);
vector<vll> dist(n + 1, vll(n + 1, linf));
rep(i, 1, n + 1) {
dist[i][i] = 0;
}
rep(i, 0, m) {
int u, v, w;
cin >> u >> v >> w;
g[u].eb(v, w);
g[v].eb(u, w);
dist[u][v] = dist[v][u] = w;
}
rep(k, 1, n + 1) {
rep(i, 1, n + 1) {
rep(j, 1, n + 1) {
cmin(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
vector<vi> far(n + 1);
rep(i, 1, n + 1) {
if (sz(g[i]) <= 1) {
continue;
}
ll mx = 0;
rep(j, 1, n + 1) {
if (dist[i][j] == mx) {
far[i].pb(j);
} else if (dist[i][j] > mx) {
far[i] = {j};
mx = dist[i][j];
}
}
}
// debug(far);
int p1 = -1;
for (auto &[u, _] : g[t]) {
if (dist[p][t] == dist[p][u] + dist[u][t]) {
p1 = u;
}
}
vi reach(n + 1, 0);
auto dfs = [&](auto &&self, int u) -> void {
reach[u] = 1;
for (auto &[v, _] : g[u]) {
if (!((v == p1 && u == t) || (u == p1 && v == t)) && !reach[v]) {
self(self, v);
}
}
};
dfs(dfs, t);
ll md = -linf;
vi t1;
rep(i, 1, n + 1) {
if (!reach[i]) {
continue;
}
if (dist[t][i] > md) {
md = dist[t][i];
t1 = {i};
} else if (dist[t][i] == md) {
t1.pb(i);
}
}
rep(i, 1, n + 1) {
for (auto &j : far[i]) {
cout << j << ' ';
}
cout << '\n';
}
debug(t1);
ll ans = dist[p][t];
vi was(n + 1, 0);
vll mx(n + 1, 0);
auto dfs2 = [&](auto &&self, int u) -> ll {
if (was[u] == 2) {
return mx[u];
} else if (was[u] == 1) {
return linf;
}
// if (sz(g[u]) == 1) {
// return 0;
// }
was[u] = 1;
for (auto &v : far[u]) {
cmax(mx[u], self(self, v) + dist[u][v]);
// if (was[v] == 0) {
// cmax(mx[u], dist[u][v] + self(self, v));
// } else if (was[v] == 1) {
// return mx[u] = linf;
// } else {
// cmax(mx[u], dist[u][v] + mx[v]);
// }
}
was[u] = 2;
return mx[u];
};
for (auto &i : t1) {
debug(i, dfs2(dfs2, i));
cmax(ans, dfs2(dfs2, i) + dist[p][t] + dist[t][i]);
// debug(ans);
}
if (ans > ll(1e17)) {
cout << "impossible\n";
} else {
cout << ans << '\n';
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3572kb
input:
9 10 1 2 1 2 225869 2 3 1772 3 4 314393 4 5 692250 5 6 684107 4 6 532792 3 7 441133 7 8 468183 8 9 186297 7 9 228792
output:
5 5 8 8 8 5 5 5 impossible
result:
wrong answer 1st lines differ - expected: 'impossible', found: ''