제출 #1328953

#제출 시각아이디문제언어결과실행 시간메모리
1328953maomaoCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
200 ms19336 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,s,n) for(int i=s;i<=n;i++)
#define vi vector<int>
#define pb push_back
#define pii pair<int,int>
#define eb emplace_back
#define fi first
#define se second
#define tup pair<int, pii>
const int N = 1e5 + 5;
vector<vector<pii>> adj(N);
int n,m,s,t,u,v;

void tmin(int &a, int b) {
	if(a>b) a=b;
}
vi dijkstra(int src) {
	vi d(N, LLONG_MAX);
	d[src] = 0;
	priority_queue<pii, vector<pii>, greater<pii>> pq;
	pq.push({d[src], src});
	while(!pq.empty()) {
		pii p = pq.top(); pq.pop();
		for(pii p1 : adj[p.se]) {
			if(d[p1.fi]>p.fi+p1.se) {
				d[p1.fi] = p.fi + p1.se;
				pq.push({d[p1.fi], p1.fi});
			}
		}
	}
	return d;
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>s>>t>>u>>v;
    rep(i,1,m) {
		int a,b,c;
		cin>>a>>b>>c;
		adj[a].eb(b,c);
		adj[b].eb(a,c);
	}
	
	vi ds = dijkstra(s),
	dt = dijkstra(t), 
	du = dijkstra(u),
	dv = dijkstra(v);
	
	vi mnu(n+5, LLONG_MAX), mnv(n+5, LLONG_MAX);
	vi ord(n);
	rep(i,0,n-1) ord[i]=i+1;
	sort(ord.begin(), ord.end(), [&](int &a, int &b) {
		return ds[a] < ds[b];
	});
	int ans = du[v];
	rep(i,0,n-1) {
		int a = ord[i];
		tmin(mnu[a], du[a]);
		tmin(mnv[a], dv[a]);
		for(pii p : adj[a]) {
			int b = p.fi;
			if(ds[a] + p.se + dt[b] == ds[t]) {
				tmin(mnu[b],mnu[a]);
				tmin(mnv[b],mnv[a]);
				tmin(ans,min(mnu[b]+dv[b],mnv[b]+du[b]));
			}
		}
	}
	cout << ans;
    return 0;
}

/*
dijkstra S -> T
get all the path.
rep(i,1,n) try dU[i]+dV[i]

  
 */

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...