Submission #1275608

#TimeUsernameProblemLanguageResultExecution timeMemory
1275608almazCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
313 ms28608 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
// #define endl '\n'
#define ff first
#define ss second
#define pb push_back
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ar array

const int MOD = 1e9 + 7,INF = 1e18, N = 2e5 + 5;
/*
5 2
1 2 2
2 3 2
3 4 2
4 5 2
*/

void solve(){
	int n, m;
	cin >> n >> m;
	int s, t, u, v;
	cin >> s >> t >> u >> v;
	
	vector <vector <pair<int,int>>> g(n + 1);
	
	for(int i = 0;i < m;i++){
		int a, b, c;
		cin >> a >> b >> c;
		
		g[a].pb({b , c});
		g[b].pb({a , c});
	}
	
	vector <int> cnt(n + 1, INF);
	cnt[s] = 0;
	
	set <pair<int,int>> st;
	st.insert({0 , s});
	
	vector <vector <int>> p(n + 1);
	
	while(!st.empty()){
		int x = st.begin() -> ss;
		st.erase(st.begin());
		
		for(auto [i , c] : g[x]){
			if(cnt[i] > cnt[x] + c){
				cnt[i] = cnt[x] + c;
				p[i].clear();
				p[i].pb(x);
				st.insert({cnt[i] , i});
			}
			if(cnt[i] == cnt[x] + c){
				p[i].pb(x);
			}
		}
	}
	
	vector <int> cntu(n + 1, INF) , cntv(n + 1, INF);
	{
		set <pair<int,int>> st;
		st.insert({0 , u});

		cntu[u] = 0;

		while(!st.empty()){
			int x = st.begin() -> ss;
			st.erase(st.begin());
			
			for(auto [i , c] : g[x]){
				if(cntu[i] > cntu[x] + c){
					cntu[i] = cntu[x] + c;
					st.insert({cntu[i] , i});
				}
			}
		}
	}
	{
		set <pair<int,int>> st;
		st.insert({0 , v});
		
		cntv[v] = 0;
		
		while(!st.empty()){
			int x = st.begin() -> ss;
			st.erase(st.begin());
			
			for(auto [i , c] : g[x]){
				if(cntv[i] > cntv[x] + c){
					cntv[i] = cntv[x] + c;
					st.insert({cntv[i] , i});
				}
			}
		}
	}
	
	vector <int> ansu(n + 1, INF) , ansv(n + 1, INF);
	int ans = INF;
	
	ansu[t] = cntu[t];
	ansv[t] = cntv[t];
	ans = min(ans , ansu[t] + cntv[t]);
	ans = min(ans , ansv[t] + cntu[t]);
	ans = min(ans , cntu[v]);
	{
		queue <int> q;
		q.push(t);

		while(!q.empty()){
			int x = q.front();
			q.pop();
			
			for(int i : p[x]){
				if(ansu[i] > ansu[x]){
					ansu[i] = min(ansu[x], cntu[i]);
					ans = min(ans, ansu[i] + cntv[i]);
					q.push(i);
				}
			}
		}
	}
	{
		queue <int> q;
		q.push(t);

		while(!q.empty()){
			int x = q.front();
			q.pop();
			
			for(int i : p[x]){
				if(ansv[i] > ansv[x]){
					ansv[i] = min(ansv[x], cntv[i]);
					ans = min(ans, ansv[i] + cntu[i]);
					q.push(i);
				}
			}
		}
	}
	
	// for(int i = 1;i <= n;i++){
		// cout<<ansu[i]<<' ';
	// }
	// cout<<endl;
	cout<<ans<<endl;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int ti = 1;
    while (ti--) {
		solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...