Submission #283416

#TimeUsernameProblemLanguageResultExecution timeMemory
283416YJUCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
590 ms34676 KiB
#include<bits/stdc++.h>
#pragma GCC optimize("unroll-loops,no-stack-protector")
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pll;
const ll MOD=1e9+7;
const ll MOD2=998244353;
const ll N=2e5+5;
const ld pi=3.14159265359;
const ll INF=(1LL<<60);
#define SQ(i) ((i)*(i))
#define REP(i,n) for(ll i=0;i<n;i++)
#define REP1(i,n) for(ll i=1;i<=n;i++)
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define setp setprecision
#define lwb lower_bound
#define SZ(_a) (ll)_a.size()

ll n,m,S,T,U,V,x,y,w,dis,ans;
vector<pll> v[N];
vector<ll> nv[N];
ll dv[N],du[N],ds[N],uans[N],vans[N],tans[N];
ll dg[N];
priority_queue<pll,vector<pll>,greater<pll> > pq;
queue<ll> Q;

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);	
	cin>>n>>m>>S>>T>>U>>V;
	REP(i,m){
		cin>>x>>y>>w;
		v[x].pb(mp(y,w));v[y].pb(mp(x,w));
	}
	//prepare
	REP1(i,n){
		dv[i]=du[i]=ds[i]=uans[i]=vans[i]=tans[i]=INF;
	}
	//
	//build dis from U,V,S
	pq.push(mp(0,U));
	while(SZ(pq)){
		x=pq.top().Y;dis=pq.top().X;
		pq.pop();
		if(dis>=du[x])continue;
		du[x]=dis;
		for(auto i:v[x])pq.push(mp(dis+i.Y,i.X));
	}
	pq.push(mp(0,V));
	while(SZ(pq)){
		x=pq.top().Y;dis=pq.top().X;
		pq.pop();
		if(dis>=dv[x])continue;
		dv[x]=dis;
		for(auto i:v[x])pq.push(mp(dis+i.Y,i.X));
	}
	pq.push(mp(0,S));
	while(SZ(pq)){
		x=pq.top().Y;dis=pq.top().X;
		pq.pop();
		if(dis>=ds[x])continue;
		ds[x]=dis;
		for(auto i:v[x])pq.push(mp(dis+i.Y,i.X));
	}
	//end
	REP1(i,n){
		for(auto j:v[i]){
			if(ds[j.X]==ds[i]+j.Y){
				nv[i].pb(j.X);++dg[j.X];
			}
		}
	}
	Q.push(S);
	while(SZ(Q)){
		x=Q.front();
		Q.pop();
		tans[x]=min(tans[x],min(uans[x]+dv[x],vans[x]+du[x]));
		for(auto i:nv[x]){
			uans[i]=min(uans[i],min(uans[x],du[x]));
			vans[i]=min(vans[i],min(vans[x],dv[x]));
			tans[i]=min(tans[i],tans[x]);
			--dg[i];
			if(dg[i]==0)Q.push(i);
		}
	}
	/*REP1(i,n){
		cout<<i<<" "<<(uans[i]>=INF?-1:uans[i])<<" "<<(vans[i]>=INF?-1:vans[i])<<"\n";
	}*/
	ans=tans[T];
	REP1(i,n)ans=min(ans,du[i]+dv[i]);
	cout<<ans<<"\n";
	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...