Submission #1176488

#TimeUsernameProblemLanguageResultExecution timeMemory
1176488TsaganaOlympic Bus (JOI20_ho_t4)C++20
100 / 100
58 ms3504 KiB
#include<bits/stdc++.h>

#define IOS ios_base::sync_with_stdio(false);cin.tie();cout.tie();
#define all(x) x.begin(), x.end()
#define int long long
#define pq priority_queue
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define pp pop_back
#define F first
#define S second

using namespace std;

const int inf = 1e18;

int n;
int dp[510][510], ds[510];
int a[50010], b[50010], w[50010], c[50010];
vector<int> adj[510];
bool vis[510];

void fmn(int &a, int b) {a = min(a, b);}
void fmx(int &a, int b) {b = max(a, b);}

int dij(int s, int t) {
	fill(ds, ds + n + 1, inf);
	fill(vis, vis + n, false);
	ds[s] = 0;
	for (int i = 0; i < n; i++) {
		int u = n;
		for (int v = 0; v < n; v++) if (!vis[v] && ds[v] < ds[u]) u = v;
		vis[u] = 1;
		if (ds[u] == inf) break ;
		for (int e: adj[u]) fmn(ds[b[e]], ds[u] + w[e]);
	}
	return ds[t];
}

void solve () {
	int m; cin >> n >> m;
	
	for (int u = 0; u < n; u++)
	for (int v = 0; v < n; v++)
		dp[u][v] = (u == v ? 0 : inf);
	
	for (int e = 0; e < m; e++) {
		cin >> a[e] >> b[e] >> w[e] >> c[e], --a[e], --b[e];
		fmn(dp[a[e]][b[e]], w[e]);
		adj[a[e]].pb(e);
	}

	for (int w = 0; w < n; w++)
	for (int u = 0; u < n; u++)
	for (int v = 0; v < n; v++)
		fmn(dp[u][v], dp[u][w] + dp[w][v]);

	int s = 0, t = n - 1,  ans = dp[s][t] + dp[t][s];
	for (int e = 0; e < m; e++) {
		int to = min(dp[s][t], dp[s][b[e]] + w[e] + dp[a[e]][t]);
		int fr = min(dp[t][s], dp[t][b[e]] + w[e] + dp[a[e]][s]);
		if (c[e] + to + fr < ans) {
			adj[a[e]].erase(find(all(adj[a[e]]), e));
			swap(a[e], b[e]);
			adj[a[e]].pb(e);
			fmn(ans, c[e] + dij(s, t) + dij(t, s));
			adj[a[e]].pp();
			swap(a[e], b[e]);
			adj[a[e]].pb(e);
		}
	}

	cout << (ans < inf ? ans : -1);
}
signed main() {IOS solve(); return 0;}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...