Submission #1315245

#TimeUsernameProblemLanguageResultExecution timeMemory
1315245JuanJLCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
887 ms74804 KiB
#include <bits/stdc++.h>

#define fst first
#define snd second
#define pb push_back
#define SZ(x) (int)x.size()
#define ALL(x) x.begin(),x.end()
#define mset(a,v) memset(a,v,sizeof(a))
#define forn(i,a,b) for(int i = a; i < b; i++)
#define FIN ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long ll;

const int MAXM = 400000+5;
const int MAXN = 100000+5;

ll n,m;
ll s,t;
ll u,v;
pair<pair<ll,ll>,ll> ari[MAXM*2];
vector<pair<pair<ll,ll>,ll>> adj[MAXN];

vector<vector<ll>> dijkstra(ll i){

	vector<vector<ll>> dist(n,vector<ll>(2,-1));
	priority_queue<pair<pair<ll,ll>,pair<ll,ll>>> cola; cola.push({{0,i},{-1,0}});
	while(!cola.empty()){
		ll nd=cola.top().fst.snd;
		ll c=cola.top().fst.fst*-1;
		ll state = cola.top().snd.snd;
		ll iari = cola.top().snd.fst;
		cola.pop();
		//cout<<nd<<" "<<c<<'\n';
		if(dist[nd][state]!=-1) continue;
		dist[nd][state]=c;

		for(auto i:adj[nd]){
			if(ari[i.snd].snd==0 && state!=0) continue;
			ll nstate = state;
			ll niari = i.snd;
			if(ari[i.snd].snd!=0 && iari!=-1 && ari[iari].snd==0) nstate++;
			cola.push({{(c+ari[i.snd].snd)*-1,i.fst.fst},{niari,nstate}});
		}
	}

	return dist;
}

int main(){FIN;
	cin>>n>>m;
	cin>>s>>t; s--; t--;
	cin>>u>>v; u--; v--;
	forn(i,0,m){
		cin>>ari[2*i].fst.fst; ari[2*i].fst.fst--;
		cin>>ari[2*i].fst.snd; ari[2*i].fst.snd--;
		cin>>ari[2*i].snd;
		
		ari[2*i+1].fst.fst = ari[2*i].fst.snd;
		ari[2*i+1].fst.snd = ari[2*i].fst.fst;
		ari[2*i+1].snd=ari[2*i].snd;
	}
	
	forn(i,0,m){
		ll uu = ari[2*i].fst.fst;
		ll vv = ari[2*i].fst.snd;
		ll c = ari[2*i].snd;
		adj[uu].pb({{vv,c},2*i});
		adj[vv].pb({{uu,c},2*i+1});
	}

	vector<vector<ll>> distS = dijkstra(s);
	vector<vector<ll>> distT = dijkstra(t);

	ll rdist = distS[t][0];

	//cout<<rdist<<'\n';

	forn(i,0,m){
		if(distS[ari[2*i].fst.fst][0] + distT[ari[2*i].fst.snd][0] + ari[2*i].snd == rdist){
			ari[2*i].snd=0;
		}
		if(distS[ari[2*i+1].fst.fst][0] + distT[ari[2*i+1].fst.snd][0] + ari[2*i+1].snd == rdist){
			ari[2*i+1].snd=0;
		}
	}

	vector<vector<ll>> distU = dijkstra(u);
	vector<vector<ll>> distV = dijkstra(v);

	ll res = 10000000000000000;
	if(distU[v][0]!=-1) res=min(res,distU[v][0]);
	if(distU[v][1]!=-1) res=min(res,distU[v][1]);
	if(distV[u][0]!=-1) res=min(res,distV[u][0]);
	if(distV[u][1]!=-1) res=min(res,distV[u][1]);
	cout<<res<<'\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...