Submission #1366112

#TimeUsernameProblemLanguageResultExecution timeMemory
1366112eraliCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
284 ms29300 KiB
/*
███████╗██████╗  █████╗ 
██╔════╝██╔══██╗██╔══██╗
███████╗██████╔╝███████║ --- incredible
██╔════╝██╔═══╝ ██╔══██║
███████╗██║     ██║  ██║
╚══════╝╚═╝     ╚═╝  ╚═╝
*/
#include<bits/stdc++.h>

#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") 

#define sz() size()
#define all(v) (v).begin(),(v).end() 
#define F first
#define S second
#define pb push_back
#define popb pop_back
#define ss sort
#define rr reverse 
#define pii pair <int, int>
#define pll pair <ll, ll>
 
using namespace std;
using ld = long double;
using ll = long long;

const int N = 3e5+10;
const ll inf = 1e18;
const int Mod = 1e9+7;
const int P = 273;

int n, m, S, T, U, V;
ll dp[2][N], dist[4][N], res;
vector <pii> g[N];
vector <int> g1[N];
vector <int> p[N];
bool used[N];

void djk(int v, int type) 
{
	for (int i = 1; i <= n; ++i) dist[type][i] = inf;
	
	set <pll> st;
	st.insert({0, v});
	dist[type][v] = 0;
	
	while (!st.empty()) 
	{
		auto [d, u] = *st.begin();
		st.erase(st.begin());
		
		if (dist[type][u] < d) continue;
		
		for (auto [to, w] : g[u]) 
		{
			if (dist[type][to] > d + w) 
			{
				dist[type][to] = d + w;
				st.insert({dist[type][to], to});
				if (type == 0) 
				{
					p[to].clear();
					p[to].pb(u);
				}
			} else if (type == 0 && dist[type][to] == d + w) p[to].pb(u);
		}
	}
}

void dfs(int v) 
{
	used[v] = true;
	dp[0][v] = dist[2][v];
	dp[1][v] = dist[3][v];
	
	for (auto to : g1[v]) 
	{
		if (!used[to]) dfs(to);
		
		dp[0][v] = min(dp[0][v], dp[0][to]);
		dp[1][v] = min(dp[1][v], dp[1][to]);
	}
	
	res = min({res, dist[2][v] + dp[1][v], dist[3][v] + dp[0][v]});
	
	// cout << v << ": ";
	// cout << dist[2][v] + dp[1][v] << " " << dist[3][v] + dp[0][v] << "\n";
}

void Erali_is_the_best(int testCase) 
{	
	cin >> n >> m >> S >> T >> U >> V;
	
	for (int i = 1, u, v, w; i <= m; ++i) 
	{
		cin >> u >> v >> w;
		g[u].pb({v, w});
		g[v].pb({u, w});
	}
	
	djk(S, 0);
	djk(T, 1);
	djk(U, 2);
	djk(V, 3);
	
	for (int i = 1; i <= n; ++i) 
		for (auto [to, w] : g[i]) 
			if (dist[0][i] + dist[1][to] + w == dist[0][T]) 
				g1[i].pb(to);
	
	res = dist[2][V];
	dfs(S);
	
	cout << res << "\n";
}

int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	// freopen("cardgame.in","r",stdin);
  	// freopen("cardgame.out","w",stdout);
  	int tt = 1;
	// cin >> tt; 
	for (int test = 1; test <= tt; ++test)
	{
		Erali_is_the_best(test);
	}
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...