제출 #1037399

#제출 시각아이디문제언어결과실행 시간메모리
1037399mateuszwesCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
459 ms93964 KiB
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define F first
#define S second
#define pb push_back
#define pi pair<int,int>
#define pl pair<ll,ll>
 
using namespace std;
constexpr int debug = 0;
constexpr int N = 2e6+7;

vector<pl> adj[N];
ll dist[N][4];			//dist from s, t, u, v
ll best[N][2];
bool visited[N][2];
int n, m, s, t, u, v;
ll target;

void addEdge(ll a, ll b, ll val){
	adj[a].pb({b, val});
	adj[b].pb({a, val});
}

void dijkstra(int start, int num){
	priority_queue<pl> Q;
	dist[start][num] = 0;
	Q.push({0, start});

	while(!Q.empty()){
		pl cur = Q.top();
		Q.pop();
		if(dist[cur.S][num] == -1) continue;
		for(auto k: adj[cur.S]){
			if(dist[k.F][num] == -1 || dist[k.F][num] > dist[cur.S][num]+k.S){
				dist[k.F][num] = dist[cur.S][num]+k.S;
				Q.push({-dist[k.F][num], k.F});
			}
		}
	}
}

void dfs(int cur, bool mode){		//cur is the current vertex, mode determines whether dist from s or t should increase
	visited[cur][mode] = 1;
	if(best[cur][mode] == 0) best[cur][mode] = cur;
	for(auto k: adj[cur]){
		if(dist[k.F][0]+dist[k.F][1] == target){
			if(dist[k.F][mode] > dist[cur][mode]){
				if(!visited[k.F][mode]) dfs(k.F, mode);
				if(dist[best[cur][mode]][3] > dist[best[k.F][mode]][3]) best[cur][mode] = best[k.F][mode];
			}
		}
	}
	if(mode && (cur <= n)){
		(dist[best[cur][0]][3] < dist[best[cur][1]][3]) ? adj[cur].pb({best[cur][0]+n, 0}) : adj[cur].pb({best[cur][1]+n, 0});
	}
	if(debug) cout << "EXIT " << cur << ' ' << mode << ' ' << best[cur][mode] << endl;
}

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m >> s >> t >> u >> v;

	for(int i = 0; i < m; i++){
		ll a1, a2, a3; cin >> a1 >> a2 >> a3;
		addEdge(a1, a2, a3);
		addEdge(a1+n, a2+n, a3);
	}
	for(int i = 0; i <= 2*n+1; i++){
		for(int j = 0; j < 4; j++) dist[i][j] = -1;
		if((i > 0) && (i <= n)) adj[i].pb({i+n, 0});
	}

	dijkstra(v, 3);
	dijkstra(t, 1);
	dijkstra(s, 0);

	target = dist[t][0];		//distance from s to t

	/*
	for(int j = 0; j < 4; j++){
		for(int i = 1; i <= n; i++){
			if(debug) cout << "DISTANCE " << i << ' ' << dist[i][j] << endl;
		}
	}
	*/
	

	dfs(s, 0);
	dfs(t, 1);
	dijkstra(u,2);
	cout << dist[v+n][2];


	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...