Submission #1275337

#TimeUsernameProblemLanguageResultExecution timeMemory
1275337almazCommuter Pass (JOI18_commuter_pass)C++20
24 / 100
2096 ms26624 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;
	
	int ans = INF;
	
	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 <vector <int>> p(n + 1);
	{
	vector <int> cnt(n + 1, INF);
	cnt[s] = 0;
	
	set <pair<int,int>> st;
	st.insert({0 , s});
	
	
	
	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});
			}
			else if(cnt[i] == cnt[x] + c){
				p[i].pb(x);
			}
		}
	}
}
	
	vector <int> b;
	b.pb(t);
	queue <int> q;
	q.push(t);
	vector <int> used(n + 1);
	
	while(!q.empty()){
		int x = q.front();
		q.pop();
		// cout<<x<<endl;
		
		for(int i : p[x]){
			if(!used[i]){
				used[i] = 1;
				q.push(i);
				b.pb(i);
			}
		}
	}
	vector <int> cntu(n + 1, INF) , cntv(n + 1, INF);
{
	cntu[u] = 0;
	
	set <pair<int,int>> st;
	st.insert({0 , u});
	
	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});
			}
		}
	}
}
{
	cntv[v] = 0;
	
	set <pair<int,int>> st;
	st.insert({0 , v});
	
	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});
			}
		}
	}
}
	
	ans = min(ans , cntu[v]);
	for(int i = 0;i < (int)b.size();i++){
		for(int j = i + 1;j < (int)b.size();j++){
			int f = 0;
			int h = b[i];
			int y = b[j];
			
			{
			queue <int> qi;
			qi.push(h);
			
			vector <int> us(n + 1);
			
			while(!qi.empty()){
				int x = qi.front();
				qi.pop();
				
				for(int i : p[x]){
					if(!us[i]){
						if(i == y){
							f = 1;
						}
						qi.push(i);
						us[i] = 1;
					}
				}
			}
			}
			{
			queue <int> qi;
			qi.push(y);
			
			vector <int> us(n + 1);
			
			while(!qi.empty()){
				int x = qi.front();
				qi.pop();
				
				for(int i : p[x]){
					if(!us[i]){
						if(i == h){
							f = 1;
						}
						qi.push(i);
						us[i] = 1;
					}
				}
			}
			}
			
			if(f){
				// cout<<"HERE"<<endl;
				// cout<<h<<' '<<y<<endl;
				// cout<<cntv[h]<<' '<<cntu[y]<<endl<<cntu[h]<<' '<<cntv[y]<<endl<<endl;
				ans = min(ans , cntu[h] + cntv[y]);
				ans = min(ans , cntu[y] + cntv[h]);
			}
		}
	}
	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...