제출 #1318821

#제출 시각아이디문제언어결과실행 시간메모리
1318821nhq0914Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
254 ms22692 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;

int N, M, A, B, C, D;
bool vis[maxn];

vector<pair<int, int>> ed, adj[maxn];
vector<int> dag[maxn];

struct vertex{
	long long dis;
	int state, ver;

	bool operator > (const vertex &other) const {return dis > other.dis;}	
};

void dijkstra1(int s, vector<long long> &dis) {
	priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> q;

	q.push({dis[s] = 0, s});
	while(!q.empty()){
		auto [d, v] = q.top(); q.pop();
		
		if(d > dis[v]) continue;

		for(auto &[x, w]: adj[v]){
			if(d + w >= dis[x]) continue;
			q.push({dis[x] = d + w, x});
		}
	}
}

long long dijkstra2(){
	std::array<std::vector<long long>, 3> dis;
	for(int i = 0; i < 3; ++i) dis[i].assign(N + 1, (long long)1e18);

	std::priority_queue<vertex, std::vector<vertex>, std::greater<vertex>> pq;

	pq.push({dis[0][C] = 0, 0, C});
	while(!pq.empty()){
		auto [d, s, v] = pq.top();
		pq.pop();

		if(d > dis[s][v]) continue;

		if(s == 1){
			for(int &x: dag[v]){
				if(d >= dis[1][x]) continue;
				pq.push({dis[1][x] = d, 1, x});
			}
		}
		else{
			for(auto &[x, w]: adj[v]){
				if(d + w >= dis[s][x]) continue;
				pq.push({dis[s][x] = d + w, s, x});
			}
		}
		if(s < 2 && dis[s + 1][v] > d){
			pq.push({dis[s + 1][v] = d, s + 1, v});
		}
	}

	return dis[2][D];
}

int main() {
 	// freopen("data.txt", "r", stdin);
//	freopen("path.inp", "r", stdin);
//	freopen("path.out", "w", stdout);

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> N >> M >> A >> B >> C >> D;
	for(int u, v, w; M--;){
		cin >> u >> v >> w;
		adj[u].emplace_back(v, w);
		adj[v].emplace_back(u, w);
	}

	vector <long long> fromA(N + 1, (long long)1e18);
	dijkstra1(A, fromA);

	{
		queue<int> q;
	
		q.push(B);
		vis[B] = true;
		while(!q.empty()) {
			int v = q.front(); q.pop();
		
			for(auto &[x, w]: adj[v]){
				if(fromA[v] - w != fromA[x]) continue;
				ed.emplace_back(x, v);
				if(!vis[x]) vis[x] = true, q.push(x);
			}
		}
	}

	for(auto &[u, v]: ed) dag[u].push_back(v);
	long long ans = dijkstra2();

	for(int i = 1; i <= N; ++i) dag[i].clear();
	for(auto &[u, v]: ed) dag[v].push_back(u);
	ans = min(ans, dijkstra2());

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