Submission #1356888

#TimeUsernameProblemLanguageResultExecution timeMemory
1356888cseguraCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
282 ms83976 KiB
#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;

#define optimizar_io ios_base::sync_with_stdio(0);cin.tie(0);
typedef pair<int, int>             pii;
typedef pair<long long, int>       pli;
typedef pair<pii, int>              piii;
typedef pair<long long, long long> pll;
typedef pair<pll, long long>        plll;
typedef vector<int>                vi;
typedef vector<bool>                vb;
typedef vector<vector<bool>>        vvb;
typedef vector<char>                vc;
typedef vector<vector<int>>        vvi;
typedef vector<long long>          vl;
typedef vector<vector<char>>       vvc;
typedef vector<vector<long long>>  vvl;
typedef vector<pii>                vpii;
typedef vector<piii>               vpiii;
typedef vector<pli>                vpli;
typedef vector<pll>                vpll;
typedef vector<plll>               vplll;
typedef vector<vector<plll>>       vvplll;
typedef vector<vector<pll>>        vvpll;
typedef vector<vector<piii>>       vvpiii;
typedef vector<vector<pii>>        vvpii;
typedef vector<vector<pli>>        vvpli;
typedef long long                  ll;

using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define data data_
#define endl "\n"
#define isOn(S, j) ((S) & (1ll << (j)))
#define setBit(S, j) ((S) |= (1ll << (j)))
#define clearBit(S, j) ((S) &= ~(1ll << (j)))
#define toggleBit(S, j) (S ^= (1ll << (j)))
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
#define all(x) x.begin(),x.end()
#define sz(x) x.size()
#define dbg(v) cout << "Line(" << __LINE__ << ") -> " << #v << " = " << (v) << endl

void dijkstra(vector < vector < pair<long long, int> > > &connections, int from, long long distances[], int pre[], int &farthest, bool resetDist){
	vector<bool> extracted(connections.size(), false);
	if (resetDist) for (int i = 0; i < connections.size(); i++) distances[i] = LLONG_MAX;
	distances[from] = 0;
	pre[from] = -1;
	priority_queue< pair<long long, int> , vector< pair<long long, int> >, greater< pair<long long, int > > > pq; 
	pq.push(make_pair(0, from));
	while (!pq.empty()) {
		auto front = pq.top(); 
		pq.pop(); 
		int u = front.second;
		farthest = u;
		if (extracted[u]) continue;
		extracted[u] = true;
		for (int j = 0; j < connections[u].size(); j++){
			auto v = connections[u][j];
			if (distances[u] + v.first < distances[v.second]) {
				distances[v.second] = distances[u] + v.first;
				pre[v.second] = u;
				pq.push(make_pair(distances[v.second], v.second));
			} 
		} 
	}
}

int main(){
	optimizar_io;
	int n, m; cin >> n >> m;
	int s, t; cin >> s >> t; s--; t--;
	int u, v; cin >> u >> v; u--; v--;
	vvpli g(n);
	for (int i = 0; i < m; i++){
		int a, b; long long w; cin >> a >> b >> w;
		a--; b--;
		g[a].pb({w, b});
		g[b].pb({w, a});
	}
	long long distS[n], distT[n];
	int preS[n], preT[n];
	int farthestS, farthestT;
	dijkstra(g, s, distS, preS, farthestS, true);
	dijkstra(g, t, distT, preT, farthestT, true);
	vvi spg_st(n); //shortest path graph from s to t
	vvi spgrev_st(n);
	for (int i = 0; i < n; i++){
		for (auto &p : g[i]){
			if (distS[i] + p.fi + distT[p.se] == distS[t]){
				spg_st[i].pb(p.se);
				spgrev_st[p.se].pb(i);
			}
		}
	}
	vvpli model(4*n);
	for (int i = 0; i < n; i++){
		for (auto &p : g[i]){
			model[i].pb({p.fi, p.se});
			model[i+3*n].pb({p.fi, p.se+3*n});
		}
		model[i].pb({0, i+n});
		model[i].pb({0, i+2*n});
		model[i+n].pb({0, i+3*n});
		model[i+2*n].pb({0, i+3*n});
	}
	for (int i = 0; i < n; i++){
		for (auto &p : spg_st[i]){
			model[i+n].pb({0, p+n});
		}
	}
	for (int i = 0; i < n; i++){
		for (auto &p : spgrev_st[i]){
			model[i+2*n].pb({0, p+2*n});
		}
	}
	long long distU[4*n];
	int preU[4*n];
	int farthestU;
	dijkstra(model, u, distU, preU, farthestU, true);
	cout << distU[v+3*n] << endl;
	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...