Submission #2996410
Source Code Expand
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
#define maxm 800010
typedef long long ll;
struct Edge {
Edge *next;
int to, w;
} *last[maxn], e[maxm], *ecnt = e;
inline void link(int a, int b, int w)
{
*++ecnt = (Edge) {last[a], b, w}; last[a] = ecnt;
*++ecnt = (Edge) {last[b], a, w}; last[b] = ecnt;
}
ll d[maxn];
int q[maxn * 10], fa[maxn];
bool inq[maxn];
int n, m, s, t;
ll f[maxn];
struct Node *null;
struct Node {
Node *ch[2];
ll val, tag;
int lca;
inline void set_tag(ll tg)
{
val += tg;
tag += tg;
}
inline void pushdown()
{
if (tag)
{
if (ch[0] != null) ch[0] -> set_tag(tag);
if (ch[1] != null) ch[1] -> set_tag(tag);
tag = 0;
}
}
} *root[maxn], mem[maxm], *tot = mem;
Node *merge(Node *a, Node *b)
{
if (a == mem) return b;
if (b == mem) return a;
if (a -> val > b -> val) std::swap(a, b);
a -> pushdown();
std::swap(a -> ch[0], a -> ch[1]);
a -> ch[1] = merge(a -> ch[1], b);
return a;
}
int son[maxn], size[maxn], top[maxn], dep[maxn], inv[maxn], dfn[maxn], timer;
void dfs1(int x)
{
size[x] = 1; dep[x] = dep[fa[x]] + 1;
for (Edge *iter = last[x]; iter; iter = iter -> next)
if (fa[iter -> to] == x)
{
dfs1(iter -> to);
size[x] += size[iter -> to];
size[iter -> to] > size[son[x]] ? son[x] = iter -> to : 0;
}
}
void dfs2(int x)
{
top[x] = son[fa[x]] == x ? top[fa[x]] : x;
dfn[x] = ++timer;
for (Edge *iter = last[x]; iter; iter = iter -> next)
if (fa[iter -> to] == x) dfs2(iter -> to);
inv[x] = timer;
}
inline int getlca(int a, int b)
{
while (top[a] != top[b])
dep[top[a]] < dep[top[b]]
? b = fa[top[b]]
: a = fa[top[a]];
return dep[a] < dep[b] ? a : b;
}
void dfs(int x)
{
root[x] = mem;
for (Edge *iter = last[x]; iter; iter = iter -> next)
if (fa[iter -> to] == x)
{
dfs(iter -> to);
if (root[iter -> to] != null) root[iter -> to] -> set_tag(iter -> w);
root[x] = merge(root[x], root[iter -> to]);
}
else if (iter -> to != fa[x])
{
*++tot = (Node) {{mem, mem}, d[iter -> to] + iter -> w, 0, getlca(x, iter -> to)};
root[x] = merge(root[x], tot);
}
while (root[x] != null && dfn[x] <= dfn[root[x] -> lca] && dfn[root[x] -> lca] <= inv[x])
root[x] = merge(root[x] -> ch[0], root[x] -> ch[1]);
f[x] = root[x] -> val;
}
inline bool check(ll x)
{
memset(d, 63, sizeof (d));
const ll inf = d[0];
int head = 0, tail = 1; d[q[1] = s] = 0;
while (head < tail)
{
int now = q[++head]; inq[now] = 0;
if (d[now] + f[now] > x) continue;
for (Edge *iter = last[now]; iter; iter = iter -> next)
if (d[iter -> to] > d[now] + iter -> w)
{
d[iter -> to] = d[now] + iter -> w;
if (!inq[iter -> to]) inq[q[++tail] = iter -> to] = 1;
}
}
return d[t] != inf;
}
int main()
{
null = mem; mem -> val = ~0ULL >> 3; mem -> ch[0] = mem -> ch[1] = mem;
scanf("%d%d%d%d", &n, &m, &s, &t);
for (int i = 1; i <= m; ++i)
{
int a, b, w; scanf("%d%d%d", &a, &b, &w);
link(a, b, w);
}
memset(d, 63, sizeof (d));
d[q[1] = t] = 0;
int head = 0, tail = 1;
while (head < tail)
{
int now = q[++head]; inq[now] = 0;
for (Edge *iter = last[now]; iter; iter = iter -> next)
if (d[iter -> to] > d[now] + iter -> w)
{
d[iter -> to] = d[now] + iter -> w;
if (!inq[iter -> to]) inq[q[++tail] = iter -> to] = 1;
}
}
for (int i = 1; i <= n; ++i)
for (Edge *iter = last[i]; iter; iter = iter -> next)
if (d[iter -> to] == d[i] + iter -> w)
fa[iter -> to] = i;
dfs1(t);
dfs2(t);
dfs(t);
// for (int i = 1; i <= n; ++i) printf("%lld\n", f[i]);
ll left = 0, right = 1e18;
while (left < right)
{
ll mid = left + right >> 1;
if (check(mid)) right = mid;
else left = mid + 1;
}
printf("%lld\n", left > 1e17 ? -1 : left);
return 0;
}
Submission Info
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:120:35: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d%d", &n, &m, &s, &t);
^
./Main.cpp:123:43: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a, b, w; scanf("%d%d%d", &a, &b, &w);
^
Judge Result
Set Name |
All |
Score / Max Score |
0 / 100 |
Status |
|
Set Name |
Test Cases |
All |
00_sample_00, 00_sample_01, 00_sample_02, 10_small_0, 10_small_1, 10_small_2, 10_small_3, 10_small_4, 10_small_5, 10_small_6, 10_small_7, 10_small_8, 10_small_9, 20_med_0, 20_med_1, 20_med_2, 20_med_3, 20_med_4, 20_med_5, 20_med_6, 21_med_0, 21_med_1, 21_med_2, 30_large_0, 30_large_1, 30_large_2, 30_large_3, 30_large_4, 30_large_5, 30_large_6, 31_large_0, 31_large_1, 31_large_2, 40_circle_0, 40_circle_1, 40_circle_2, 40_circle_3, 40_circle_4, 41_impossible_0, 41_impossible_1, 41_impossible_2, 42_special_0, 42_special_1, 42_special_10, 42_special_11, 42_special_12, 42_special_13, 42_special_14, 42_special_2, 42_special_3, 42_special_4, 42_special_5, 42_special_6, 42_special_7, 42_special_8, 42_special_9, 43_special_0, 43_special_1, 43_special_2, 43_special_3, 43_special_4, 43_special_5, 43_special_6, 43_special_7, 43_special_8, 43_special_9 |
Case Name |
Status |
Exec Time |
Memory |
00_sample_00 |
AC |
5 ms |
10368 KB |
00_sample_01 |
AC |
5 ms |
10368 KB |
00_sample_02 |
AC |
5 ms |
10368 KB |
10_small_0 |
AC |
5 ms |
10368 KB |
10_small_1 |
AC |
5 ms |
10368 KB |
10_small_2 |
AC |
5 ms |
10368 KB |
10_small_3 |
AC |
5 ms |
10368 KB |
10_small_4 |
AC |
5 ms |
10368 KB |
10_small_5 |
AC |
5 ms |
10368 KB |
10_small_6 |
AC |
5 ms |
10368 KB |
10_small_7 |
AC |
5 ms |
10368 KB |
10_small_8 |
AC |
5 ms |
10368 KB |
10_small_9 |
AC |
5 ms |
10368 KB |
20_med_0 |
AC |
130 ms |
14336 KB |
20_med_1 |
AC |
11 ms |
10368 KB |
20_med_2 |
AC |
244 ms |
14720 KB |
20_med_3 |
AC |
404 ms |
17152 KB |
20_med_4 |
AC |
186 ms |
16384 KB |
20_med_5 |
AC |
342 ms |
18176 KB |
20_med_6 |
AC |
237 ms |
14976 KB |
21_med_0 |
AC |
22 ms |
13312 KB |
21_med_1 |
AC |
359 ms |
17920 KB |
21_med_2 |
AC |
46 ms |
16896 KB |
30_large_0 |
AC |
221 ms |
16128 KB |
30_large_1 |
AC |
70 ms |
12672 KB |
30_large_2 |
AC |
104 ms |
13312 KB |
30_large_3 |
AC |
125 ms |
16640 KB |
30_large_4 |
AC |
269 ms |
16768 KB |
30_large_5 |
AC |
219 ms |
17792 KB |
30_large_6 |
AC |
114 ms |
16768 KB |
31_large_0 |
AC |
211 ms |
15360 KB |
31_large_1 |
AC |
50 ms |
16768 KB |
31_large_2 |
AC |
130 ms |
16640 KB |
40_circle_0 |
AC |
68 ms |
19200 KB |
40_circle_1 |
AC |
68 ms |
19200 KB |
40_circle_2 |
AC |
68 ms |
19200 KB |
40_circle_3 |
AC |
69 ms |
19200 KB |
40_circle_4 |
AC |
68 ms |
19200 KB |
41_impossible_0 |
AC |
557 ms |
27136 KB |
41_impossible_1 |
AC |
527 ms |
27136 KB |
41_impossible_2 |
AC |
559 ms |
27136 KB |
42_special_0 |
AC |
68 ms |
19200 KB |
42_special_1 |
AC |
69 ms |
18048 KB |
42_special_10 |
AC |
78 ms |
16896 KB |
42_special_11 |
AC |
76 ms |
16896 KB |
42_special_12 |
AC |
75 ms |
16896 KB |
42_special_13 |
AC |
74 ms |
16896 KB |
42_special_14 |
AC |
93 ms |
18944 KB |
42_special_2 |
AC |
74 ms |
17536 KB |
42_special_3 |
AC |
76 ms |
17152 KB |
42_special_4 |
AC |
80 ms |
17152 KB |
42_special_5 |
AC |
83 ms |
17024 KB |
42_special_6 |
AC |
83 ms |
16896 KB |
42_special_7 |
AC |
85 ms |
16896 KB |
42_special_8 |
AC |
84 ms |
16896 KB |
42_special_9 |
AC |
81 ms |
16896 KB |
43_special_0 |
RE |
141 ms |
16896 KB |
43_special_1 |
RE |
141 ms |
16896 KB |
43_special_2 |
RE |
140 ms |
16896 KB |
43_special_3 |
RE |
141 ms |
16896 KB |
43_special_4 |
RE |
141 ms |
16896 KB |
43_special_5 |
RE |
140 ms |
16896 KB |
43_special_6 |
RE |
140 ms |
16896 KB |
43_special_7 |
RE |
142 ms |
16896 KB |
43_special_8 |
RE |
142 ms |
16896 KB |
43_special_9 |
RE |
141 ms |
16896 KB |