제출 #41072

#제출 시각아이디문제언어결과실행 시간메모리
41072zscoderCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
543 ms21668 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
 
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;

vector<ii> adj[111111];
int n,m; 

vector<ll> dijkstra(int s)
{
	priority_queue<ii,vector<ii>,greater<ii> > pq;
	vector<ll> d(n, ll(1e18));
	pq.push(mp(0,s)); d[s] = 0;
	while(!pq.empty())
	{
		ll dist=pq.top().fi; int u=pq.top().se; pq.pop();
		for(ii x:adj[u])
		{
			ll d2 = dist + x.se;
			if(d[x.fi] > d2)
			{
				d[x.fi] = d2;
				pq.push(mp(d2, x.fi));
			}
		}
	}
	return d;
}

ll dp[111111];
ll dp2[111111];
ll dist[111111];
ll dist2[111111];

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin>>n>>m;
	int s,e,s2,e2; cin>>s>>e>>s2>>e2;
	s--; e--; s2--; e2--;
	for(int i=0;i<m;i++)
	{
		int u,v,c; cin>>u>>v>>c; u--; v--;
		adj[u].pb(mp(v,c)); adj[v].pb(mp(u,c));
	}
	vector<ll> d1 = dijkstra(s2);
	vector<ll> d2 = dijkstra(e2);
	ll ans = d1[e2];
	priority_queue<ii,vector<ii>,greater<ii> > pq;
	for(int i=0;i<n;i++) dist[i]=dist2[i]=dp[i]=dp2[i]=ll(1e18);
	dist[s] = 0; dp[s] = d2[s]; pq.push(mp(0,s));
	while(!pq.empty())
	{
		ll d=pq.top().fi; int u=pq.top().se; pq.pop(); ll pre = dp[u];
		for(ii x:adj[u])
		{
			ll dt = d + x.se; int v = x.fi;
			if(dist[v] > dt)
			{
				dp[v] = min(pre, d2[v]);
				dist[v] = dt;
				pq.push(mp(dt,v));
			}
			else if(dist[v] == dt)
			{
				dp[v] = min(dp[v], min(pre, d2[v]));
			}
		}
	}
	dist2[e] = 0; dp2[e] = d2[e]; pq.push(mp(0,e));
	while(!pq.empty())
	{
		ll d=pq.top().fi; int u=pq.top().se; pq.pop(); ll pre = dp2[u];
		for(ii x:adj[u])
		{
			ll dt = d + x.se; int v = x.fi;
			if(dist2[v] > dt)
			{
				dp2[v] = min(pre, d2[v]);
				dist2[v] = dt;
				pq.push(mp(dt,v));
			}
			else if(dist2[v] == dt)
			{
				dp2[v] = min(dp2[v], min(pre, d2[v]));
			}
		}
	}
	ll shortestori = dist[e];
	for(int i=0;i<n;i++)
	{
		if(dist[i]+dist2[i]==shortestori)
		{
			ans = min(ans, min(dp[i], dp2[i]) + d1[i]);
		}
	}
	cout<<ans<<'\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...