Submission #817909

#TimeUsernameProblemLanguageResultExecution timeMemory
817909OAleksaCommuter Pass (JOI18_commuter_pass)C++14
31 / 100
367 ms35752 KiB
#include <bits/stdc++.h>
//#include "factories.h"
//#include "wall.h"
#define f first
#define s second
#define int long long
using namespace std; 
const int maxn = 1e5 + 69;
vector<pair<int, int>> g[maxn];
int n, m, s, t, u, v;
const int inf = 1e18;
vector<int> ds(maxn, inf), dt(maxn, inf);
vector<int> du(maxn, inf), dv(maxn, inf);
vector<int> in(maxn, inf), out(maxn, inf);
vector<int> vis(maxn);
vector<tuple<int, int, int>> edges;

signed main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int tt = 1;
	//cin >> tt;
	while(tt--) {
		cin >> n >> m >> s >> t >> u >> v;
		for(int i = 0;i < m;i++) {
			int a, b, c;
			cin >> a >> b >> c;
			g[a].push_back({b, c});
			g[b].push_back({a, c});
			edges.push_back({a, b, c});
		}
		ds[s] = dt[t] = du[u] = dv[v] = 0;
		priority_queue<pair<int, int>> pq;
		pq.push({0, s});
		while(!pq.empty()) {
			auto u = pq.top();
			pq.pop();
			for(auto v : g[u.s]) {
				if(ds[v.f] <= ds[u.s] + v.s)
					continue;
				ds[v.f] = ds[u.s] + v.s;
				pq.push({-ds[v.f], v.f});
			}
		}
		pq.push({0, t});
		while(!pq.empty()) {
			auto u = pq.top();
			pq.pop();
			for(auto v : g[u.s]) {
				if(dt[v.f] <= dt[u.s] + v.s)
					continue;
				dt[v.f] = dt[u.s] + v.s;
				pq.push({-dt[v.f], v.f});
			}
		}
		pq.push({0, u});
		while(!pq.empty()) {
			auto u = pq.top();
			pq.pop();
			for(auto v : g[u.s]) {
				if(du[v.f] <= du[u.s] + v.s)
					continue;
				du[v.f] = du[u.s] + v.s;
				pq.push({-du[v.f], v.f});
			}
		}
		pq.push({0, v});
		while(!pq.empty()) {
			auto u = pq.top();
			pq.pop();
			for(auto v : g[u.s]) {
				if(dv[v.f] <= dv[u.s] + v.s)
					continue;
				dv[v.f] = dv[u.s] + v.s;
				pq.push({-dv[v.f], v.f});
			}
		}
		vector<pair<int, int>> v;
		for(int i = 1;i <= n;i++)
			v.push_back({du[i], i});
		sort(v.begin(), v.end());
		function<void(int)> dfs = [&](int v) {
			vis[v] = true;
			for(auto u : g[v]) {
				if(!vis[u.f] && (ds[u.f] + dt[v] + u.s == ds[t] || ds[v] + dt[u.f] + u.s == ds[t])) {
					in[u.f] = in[v];
					dfs(u.f);
				}
			}
		};
		for(int i = 0;i < n;i++) {
			if(!vis[v[i].s]) {
				in[v[i].s] = v[i].f;
				dfs(v[i].s);
			}
		}
		v.clear();
		for(int i = 1;i <= n;i++) {
			v.push_back({dv[i], i});
			vis[i] = false;
		}
		sort(v.begin(), v.end());
		function<void(int)> dfs1 = [&](int v) {
			vis[v] = true;
			for(auto u : g[v]) {
				if(!vis[u.f] && (ds[u.f] + dt[v] + u.s == ds[t] || ds[v] + dt[u.f] + u.s == ds[t])) {
					out[u.f] = out[v];
					dfs1(u.f);
				}
			}
		};
		for(int i = 0;i < n;i++) {
			if(!vis[v[i].s]) {
				out[v[i].s] = v[i].f;
				dfs1(v[i].s);
			}
		}
		int ans = inf;
		for(int i = 1;i <= n;i++) 
			ans = min(ans, in[i] + out[i]);
		cout << ans;
	}
   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...