제출 #1163387

#제출 시각아이디문제언어결과실행 시간메모리
1163387boclobanchatCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
276 ms23664 KiB
#include<bits/stdc++.h>
using namespace std;
#define ii pair<long long,long long>
#define fi first
#define se second
const int MAXN=2e5+5;
const long long INF=1e18;
vector<ii> ds[MAXN];
priority_queue< ii,vector<ii>,greater<ii> > pq;
long long dp[MAXN],ans[MAXN][3],pdp[MAXN];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m,s,t,u,v;
	cin>>n>>m>>s>>t>>u>>v;
	for(int i=1;i<=m;i++)
	{
		int l,r,v;
		cin>>l>>r>>v;
		ds[l].push_back({r,v}),ds[r].push_back({l,v});
	}
	for(int i=1;i<=n;i++) dp[i]=INF*(i!=s),pdp[i]=INF*(i!=t),ans[i][0]=ans[i][1]=ans[i][2]=INF*(i!=u);
	pq.push({0,s});
	while(!pq.empty())
	{
		long long a=pq.top().fi,b=pq.top().se;
		pq.pop();
		if(dp[b]<a) continue;
		for(auto v:ds[b]) if(dp[v.fi]>a+v.se) pq.push({dp[v.fi]=a+v.se,v.fi});
	}
	pq.push({0,t});
	while(!pq.empty())
	{
		long long a=pq.top().fi,b=pq.top().se;
		pq.pop();
		if(pdp[b]<a) continue;
		for(auto v:ds[b]) if(pdp[v.fi]>a+v.se) pq.push({pdp[v.fi]=a+v.se,v.fi});
	}
	pq.push({0,u*3}),ans[u][1]=ans[u][2]=INF;
	while(!pq.empty())
	{
		long long a=pq.top().fi,b=pq.top().se/3,c=pq.top().se%3;
		pq.pop();
		if(ans[b][c]<a) continue;
		for(auto v:ds[b])
		{
			bool res=(dp[b]+pdp[v.fi]+v.se!=dp[t]);
			if(c==0)
			{
				if(ans[v.fi][1-res]>a+v.se*res) pq.push({ans[v.fi][1-res]=a+v.se*res,v.fi*3+1-res});
				if(ans[v.fi][0]>a+v.se) pq.push({ans[v.fi][0]=a+v.se,v.fi*3});
			}
			else if(c==1)
			{
				if(ans[v.fi][c+res]>a+v.se*res) pq.push({ans[v.fi][c+res]=a+v.se*res,v.fi*3+c+res});
				if(ans[v.fi][2]>a+v.se) pq.push({ans[v.fi][2]=a+v.se,v.fi*3+2});
			}
			else
			{
				if(ans[v.fi][c]>a+v.se) pq.push({ans[v.fi][c]=a+v.se,v.fi*3+c});
			}
		}
	}
	long long a=min(ans[v][0],min(ans[v][1],ans[v][2]));
	for(int i=1;i<=n;i++) ans[i][0]=ans[i][1]=ans[i][2]=INF*(i!=u);
	pq.push({0,u*3}),ans[u][1]=ans[u][2]=INF;
	while(!pq.empty())
	{
		long long a=pq.top().fi,b=pq.top().se/3,c=pq.top().se%3;
		pq.pop();
		if(ans[b][c]<a) continue;
		for(auto v:ds[b])
		{
			bool res=(dp[v.fi]+pdp[b]+v.se!=dp[t]);
			if(c==0)
			{
				if(ans[v.fi][1-res]>a+v.se*res) pq.push({ans[v.fi][1-res]=a+v.se*res,v.fi*3+1-res});
				if(ans[v.fi][0]>a+v.se) pq.push({ans[v.fi][0]=a+v.se,v.fi*3});
			}
			else if(c==1)
			{
				if(ans[v.fi][c+res]>a+v.se*res) pq.push({ans[v.fi][c+res]=a+v.se*res,v.fi*3+c+res});
				if(ans[v.fi][2]>a+v.se) pq.push({ans[v.fi][2]=a+v.se,v.fi*3+2});
			}
			else
			{
				if(ans[v.fi][c]>a+v.se) pq.push({ans[v.fi][c]=a+v.se,v.fi*3+c});
			}
		}
	}
	cout<<min(min(a,ans[v][0]),min(ans[v][1],ans[v][2]));
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...