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

Submission Time
Task D - Revenge of the Broken Door
User chentong
Language C++14 (GCC 5.4.1)
Score 0
Code Size 3898 Byte
Status RE
Exec Time 559 ms
Memory 27136 KB

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
AC × 56
RE × 10
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