Submission #291010

#TimeUsernameProblemLanguageResultExecution timeMemory
291010cheissmartOlympic Bus (JOI20_ho_t4)C++14
100 / 100
475 ms9888 KiB
#include <iostream>
#include <queue>
#include <vector>
#include <array>
#pragma GCC optimize("Ofast")
#define F first
#define S second
#define MP make_pair
#define PB push_back
#define EB emplace_back
#define V vector
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef V<int> vi;

const int N = 1e5 + 7, INF = 1e9 + 7;

int u[N], v[N], c[N], d[N], d1[N], d2[N], tmp[N], from[N], is1[N], is2[N], dd1[N], dd2[N], is11[N], is22[N];
int n, m;
V<array<int, 3>> G[N], rG[N];
int vis[N];
void go(V<array<int, 3>>* G, int s, int* d, int no = -1) {
	for(int i = 1; i <= n; i++) d[i] = INF, vis[i] = 0;
	d[s] = 0;
	for(int i = 1; i <= n; i++) {
		int u = -1, mn = INF + 1;
		for(int j = 1; j <= n; j++) {
			if(!vis[j] && d[j] < mn) {
				mn = d[j];
				u = j;
			}
		}
		for(auto e:G[u]) {
			int v = e[0], w = e[1];
			if(e[2] == no) continue;
			if(d[u] + w < d[v]) {
				d[v] = d[u] + w;
				from[v] = e[2];
			}
		}
		vis[u] = 1;
	}
	
}

int no1(int i, int u) {
	if(!is1[i]) return d1[u];
	go(G, 1, tmp, i);
	return tmp[u];
}

int no2(int i, int u) {
	if(!is2[i]) return d2[u];
	go(G, n, tmp, i);
	return tmp[u];
}

int no11(int i, int u) {
	if(!is11[i]) return dd1[u];
	go(rG, 1, tmp, i);
	return tmp[u];
}

int no22(int i, int u) {
	if(!is22[i]) return dd2[u];
	go(rG, n, tmp, i);
	return tmp[u];
}

signed main()
{
	cin >> n >> m;
	for(int i = 0; i < m; i++) {
		cin >> u[i] >> v[i] >> c[i] >> d[i];
		G[u[i]].PB({v[i], c[i], i});
		rG[v[i]].PB({u[i], c[i], i});
 	}
 	go(G, 1, d1);
 	for(int i = 2; i <= n; i++) {
		if(d1[i] < INF) is1[from[i]] = 1;
	}
 	go(G, n, d2);
 	for(int i = 1; i < n; i++) {
		if(d2[i] < INF) is2[from[i]] = 1;
	}
	
	go(rG, 1, dd1);
 	for(int i = 2; i <= n; i++) {
		if(dd1[i] < INF) is11[from[i]] = 1;
	}
	go(rG, n, dd2);
 	for(int i = 1; i < n; i++) {
		if(dd2[i] < INF) is22[from[i]] = 1;
	}
/*	
	for(int i = 0; i < m; i++) if(is1[i]) cerr << i << " ";
	cerr << endl;
	for(int i = 0; i < m; i++) if(is2[i]) cerr << i << " ";
	cerr << endl;
*/
 	ll ans = d1[n] + d2[1];
  	for(int i = 0; i < m; i++) {
		int ans1 = min(no1(i, v[i]) + no22(i, u[i]) + c[i], no1(i, n));
		int ans2 = min(no11(i, u[i]) + no2(i, v[i]) + c[i], no2(i, 1));
 		ans = min(ans, (ll) ans1 + ans2 + d[i]);
	}
 	if(ans >= INF) ans = -1;
 	cout << ans << endl;
 	
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...