제출 #1286601

#제출 시각아이디문제언어결과실행 시간메모리
1286601thirdOlympic Bus (JOI20_ho_t4)C++20
100 / 100
558 ms8300 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define int long long
#define pii pair<ll, ll>
#define fi first
#define se second
#define endl '\n'
#define TASK ""
#define N 200005
#define LOG 17
using namespace std;

bool ghuy4g;

const ll inf = 1e16;

struct Canh {
	ll u, v, c, w;
} canh[50004];

ll n, m;
vector<pii> adj[2][N];

int d[2][2][205][205];

ll trace[2][2][205][205], ans = inf;

vector<ll> vt[2][2];

ll is[50004][2][2]; // canh do, voi t0, t1 co bi nam tren duong di hay khong

void dij(ll t0, ll t1, ll t2, ll st) {
	priority_queue<pii, vector<pii>, greater<pii>> pq;
	for (int i = 1; i <= n; i ++) {
		d[t0][t1][t2][i] = inf;
	}
	d[t0][t1][t2][st] = 0;
	pq.push({d[t0][t1][t2][st], st});
	while (pq.size()) {
		auto u = pq.top().se;
		auto c = pq.top().fi;
		pq.pop();
		if (c > d[t0][t1][t2][u]) continue;
		for (auto v : adj[t1][u]) {
			if (t2 > 0 && v.se == vt[t0][t1][t2 - 1]) continue;
			if (d[t0][t1][t2][v.fi] > c + canh[v.se].c) {
				d[t0][t1][t2][v.fi] = c + canh[v.se].c;
				trace[t0][t1][t2][v.fi] = v.se;
				pq.push({d[t0][t1][t2][v.fi], v.fi});
			}
		}
	}
}

void tv(ll t0, ll t1, ll st) {
	/*for (int i = 1; i <= n; i ++) {
		if (i == st) continue;
		ll id = trace[t0][t1][0][i];
		vt[t0][t1].push_back(id);
		is[id][t0][t1] = vt[t0][t1].size();
		dij(t0, t1, vt[t0][t1].size(), st);
	}*/
	for (int i = 1; i <= n; i ++) {
		if (i == st) continue;
		ll id = trace[t0][t1][0][i];
		ll u = canh[id].u, v = canh[id].v, c = canh[id].c;
		if (t1 == 0) {
			if (t0 == 0) {
				if (d[0][0][0][u] + c + d[1][1][0][v] != d[0][0][0][n]) {
					continue;
				}
			}
			else {
				if (d[1][0][0][u] + c + d[0][1][0][v] != d[1][0][0][1]) {
					continue;
				}
			}
		}
		else if (t1 == 1) {
			if (t0 == 0) {
				if (d[0][0][0][v] + c + d[1][1][0][u] != d[0][0][0][n]) {
					continue;
				}
			}
			else {
				if (d[1][0][0][v] + c + d[0][1][0][u] != d[1][0][0][1]) {
					continue;
				}
			}
		}
		vt[t0][t1].push_back(id);
		is[id][t0][t1] = vt[t0][t1].size();
		dij(t0, t1, vt[t0][t1].size(), st);
	}
}

void pre() {
	dij(0, 0, 0, 1); // tu 1
	dij(1, 0, 0, n); // tu n
	
	dij(0, 1, 0, 1); // den 1
	dij(1, 1, 0, n); // den n
	
	tv(0, 0, 1);
	tv(1, 0, n);
	
	tv(0, 1, 1);
	tv(1, 1, n);
}

void solve() {
	ans = min(ans, d[0][0][0][n] + d[1][0][0][1]);
	//cout << ans << endl;
	for (int i = 1; i <= m; i ++) {
		ll u = canh[i].u, v = canh[i].v, e = canh[i].w + canh[i].c;
		// chieu di dis1 = d1 + e + d2;
		ll d1 = d[0][0][is[i][0][0]][v];
		ll d2 = d[1][1][is[i][1][1]][u];
		ll dis1 = min(d[0][0][is[i][0][0]][n], d1 + e + d2);
		
		ll go_not = d[0][0][is[i][0][0]][n];
		ll go_use = d1 + d2 + canh[i].c;
		
		// chieu ve dis2 = d1 + e + d2;
		d1 = d[1][0][is[i][1][0]][v];
		d2 = d[0][1][is[i][0][1]][u];
		ll dis2 = min(d[1][0][is[i][1][0]][1], d1 + d2 + e);
		
		ll back_not = d[1][0][is[i][1][0]][1];
		ll back_use = d1 + d2 + canh[i].c;
		
		ans = min(ans, canh[i].w + min(go_not, go_use) + min(back_not, back_use));
		
	}
	if (ans >= inf) ans = -1;
	cout << ans;
}

bool klinh;

signed main() {
   // freopen("test.inp", "r", stdin);
	//freopen("test.out", "w", stdout);
	//srand(time(0));
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> m;
    for (int i = 1; i <= m; i ++) {
    	ll u, v, c, w;
    	cin >> u >> v >> c >> w;
    	adj[0][u].push_back({v, i});
    	adj[1][v].push_back({u, i});
    	canh[i] = {u, v, c, w};
    }
    pre();
    
    solve();
   	
   	cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...