Submission #1226253

#TimeUsernameProblemLanguageResultExecution timeMemory
1226253chaeryeongAesthetic (NOI20_aesthetic)C++20
100 / 100
987 ms80296 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e18;
const int MAXN = 3e5 + 25;
vector <array <ll, 3>> adj[MAXN];
array <ll, 4> edges[MAXN];
int n, m;
ll dist[2][MAXN];
void dijkstra (int c, int node) {
	for (int i = 1; i <= n; i++) {
		dist[c][i] = inf;
	}
	dist[c][node] = 0;
	priority_queue <pair <ll, ll>, vector <pair <ll, ll>>, greater <>> pq;
	pq.push({0, node});
	while (!pq.empty()) {
		auto k = pq.top();
		pq.pop();
		if (k.first > dist[c][k.second]) {
			continue;
		}
		for (auto [j, w, e] : adj[k.second]) {
			if (w + k.first < dist[c][j]) {
				dist[c][j] = w + k.first;
				pq.push({dist[c][j], j});
			}
		}
	}
/*	cout << node << ": ";
	for (int i = 1; i <= n; i++) {
		cout << dist[c][i] << " ";
	}
	cout << '\n';*/
}
vector <pair <int, int>> c[MAXN];
int in[MAXN], out[MAXN], tt, dp[MAXN], vis[MAXN];
int flag;
ll T;
void dfs (int pos, int par) {
	in[pos] = ++tt;
	dp[pos] = tt;
	vis[pos] = 1;
	for (auto [j, i] : c[pos]) {
		if (j == par) {
			continue;
		}
		if (!vis[j]) {
			dfs(j, pos);
			dp[pos] = min(dp[pos], dp[j]);
			if (dp[j] > in[pos] && vis[n] && in[j] <= in[n] && out[n] <= out[j]) {
				int u = 1;
				u &= dist[0][pos] + dist[1][j] + edges[i][2] + edges[i][3] > T;
				u &= dist[0][j] + dist[1][pos] + edges[i][2] + edges[i][3] > T;
				flag |= u;
			}
		} else {
			dp[pos] = min(dp[pos], in[j]);
		}
	}
	out[pos] = tt;
}
bool check (ll t) {
	T = t;
	for (int i = 1; i <= n; i++) {
		c[i].clear(); vis[i] = 0;
		in[i] = out[i] = 0;
	}
	tt = 0; flag = 0;
	for (int i = 1; i <= m; i++) {
		auto x = edges[i];
		if (dist[0][x[0]] + dist[1][x[1]] + x[2] <= t || dist[0][x[1]] + dist[1][x[0]] + x[2] <= t) {
			c[x[0]].push_back({x[1], i});
			c[x[1]].push_back({x[0], i});
		}
	}
	dfs(1, -1);
	return flag;
}
void solve () {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int a, b, c; cin >> a >> b >> c;
		if (a == b) {
			m--; i--; continue;
		}
		edges[i] = {a, b, c, 0};
	}
	ll mx = 0;
	for (int i = m; i >= 1; i--) {
		edges[i][3] = mx;
		mx = max(mx, edges[i][2]);
	}
	for (int i = 1; i <= m; i++) {
		adj[edges[i][0]].push_back({edges[i][1], edges[i][2], edges[i][3]});
		adj[edges[i][1]].push_back({edges[i][0], edges[i][2], edges[i][3]});
	}
	dijkstra(0, 1);
	dijkstra(1, n);
	ll l = dist[0][n], r = dist[0][n] + 1e9, ans = dist[0][n] - 1;
	while (l <= r) {
		ll mid = (l + r) / 2;
		if (check(mid)) {
			l = mid + 1; ans = mid;
		} else {
			r = mid - 1;
		}
	}
	cout << ans + 1 << '\n';
}	
signed main () {
	ios::sync_with_stdio(0); cin.tie(0);
	int tc = 1; //cin >> tc;
	while (tc--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...