제출 #480490

#제출 시각아이디문제언어결과실행 시간메모리
480490ymmCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
862 ms68608 KiB
///
///   ♪ Pizza mozzarella rella rella rella... ♪
///

#include <bits/stdc++.h>
#define Loop(x,l,r) for(ll x = ll(l); x < ll(r); ++x)
typedef long long ll;
typedef std::pair<ll,ll> pll;
using namespace std;

const int N = 100'010;
const ll inf = 1e15;
int n, m;
int s, t;
int u, v;

vector<ll> dij(vector<pll>* A, int s, int n, vector<int>* par = NULL)
{
	vector<ll> dis(n);
	set<pll> pq;
	Loop(i,0,n) dis[i] = (i==s?0:inf);
	pq.emplace(0,s);
	while(pq.size())
	{
		auto v = pq.begin()->second;
		pq.erase(pq.begin());
		for(auto [u, w] : A[v])
		{
			if(dis[v] + w < dis[u])
			{
				if(par) par[u].clear();
				pq.erase ({dis[u], u});
				dis[u] = dis[v] + w;
				pq.insert({dis[u], u});
			}
			if(dis[v] + w == dis[u] && par)
				par[u].push_back(v);
		}
	}
	return dis;
}

vector<pll> A[4*N];
vector<int> par[N];

bool vis[N];
void jotaro(int v)
{
	vis[v] = 1;
	for(auto p : par[v]){
		A[n+p].emplace_back(n+v,0);
		A[2*n+v].emplace_back(2*n+p,0);
		if(!vis[p])
			jotaro(p);
	}
}

int main()
{
	ios::sync_with_stdio(false); cin.tie(0);
	cin >> n >> m >> s >> t >> u >> v;
	--s; --t; --u; --v;
	Loop(_,0,m)
	{
		int v, u, w;
		cin >> v >> u >> w;
		--v; --u;
		A[v].emplace_back(u,w);
		A[u].emplace_back(v,w);
		A[3*n+v].emplace_back(3*n+u,w);
		A[3*n+u].emplace_back(3*n+v,w);
	}
	dij(A, s, n, par);
	jotaro(t);
	Loop(i,0,n)
	{
		A[0*n+i].emplace_back(1*n+i, 0);
		A[0*n+i].emplace_back(2*n+i, 0);
		A[1*n+i].emplace_back(3*n+i, 0);
		A[2*n+i].emplace_back(3*n+i, 0);
	}
	cout << dij(A, v, 4*n)[3*n+u] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...