This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "dreaming.h"
#include <vector>
#define MAXN 100000
struct myc {
int x, y;
};
std::vector < myc > g[MAXN];
int ans, best, t[MAXN], opa[MAXN], ops[MAXN], cine[MAXN];
bool viz[MAXN];
void dfs1(int x) {
viz[x] = 1;
for (auto &y : g[x]) {
if (viz[y.x] == 0) {
t[y.x] = x;
dfs1(y.x);
if (opa[y.x] + y.y > opa[x]) {
ops[x] = opa[x];
opa[x] = opa[y.x] + y.y;
cine[x] = y.x;
} else if (opa[y.x] + y.y > ops[x])
ops[x] = opa[y.x] + y.y;
}
}
}
void dfs2(int x, int sus) {
int cat = std::max(opa[x], sus);
if (cat > ans)
ans = cat;
if (best == -1 || cat < best)
best = cat;
for (auto &y : g[x]) {
if (t[y.x] == x) {
if (y.x == cine[x])
dfs2(y.x, y.y + std::max(sus, ops[x]));
else
dfs2(y.x, y.y + std::max(sus, opa[x]));
}
}
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
for (int i = 0; i < M; i++) {
g[A[i]].push_back({B[i], T[i]});
g[B[i]].push_back({A[i], T[i]});
}
ans = 0;
int max1 = -1, max2 = -1, max3 = -1;
for (int i = 0; i < N; i++) {
if (viz[i] == 0) {
dfs1(i);
best = -1;
dfs2(i, 0);
if (best > max1) {
max3 = max2;
max2 = max1;
max1 = best;
} else if (best > max2) {
max3 = max2;
max2 = best;
} else if (best > max3)
max3 = best;
}
}
if (max2 != -1)
ans = std::max(ans, max1 + max2 + L);
if (max3 != -1)
ans = std::max(ans, max2 + max3 + 2 * L);
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |