제출 #678646

#제출 시각아이디문제언어결과실행 시간메모리
678646anhduc2701Commuter Pass (JOI18_commuter_pass)C++17
0 / 100
128 ms24884 KiB
/*
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("unroll-loops")
*/
#include<bits/stdc++.h>
#define int long long
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define eb emplace_back
#define PI 3.14159265359
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define BIT(x,i) (1&((x)>>(i)))
#define MASK(x) (1LL<<(x))
#define task "tnc"  
using namespace std;
typedef long long ll;
const ll INF=1e18;
const int maxn=1e5+5;
const int mod=1e9+7;
const int mo=998244353;
using pi=pair<ll,ll>;
using vi=vector<ll>;
using pii=pair<pair<ll,ll>,ll>;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n,m;
struct Edge{
	int u,v,w,id;
	Edge(){}
	Edge(int _u,int _v,int _w,int _id){
		u=_u;
		v=_v;
		w=_w;
		id=_id;
	}
}ed[maxn];
vector<Edge>G[maxn];
vector<pair<int,int>>trace[maxn];
vector<int>G2[maxn];
int d[maxn];
int deg[maxn];
int du[maxn];
int dv[maxn];
int dp[maxn];
int dp1[maxn];
int ok[maxn];
int s,t;
int u,v;
void DIJ(){
	for(int i=1;i<=n;i++)d[i]=INF;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
	pq.push({0,s});
	d[s]=0;
	while(pq.size()){
		pair<int,int>cha=pq.top();
		pq.pop();
		if(d[cha.se]!=cha.fi)continue;
		for(Edge canh:G[cha.se]){
			if(d[cha.second]+canh.w<d[canh.v]){
				d[canh.v]=d[cha.second]+canh.w;
				trace[canh.v].clear();
				trace[canh.v].pb({cha.se,canh.id});
				pq.push({d[canh.v],canh.v});
			}
			else if(d[cha.se]+canh.w==d[canh.v]){
				trace[canh.v].pb({cha.se,canh.id});
			}
		}
	}
}
void DIJ1(){
	for(int i=1;i<=n;i++)du[i]=INF;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
	pq.push({0,u});
	du[u]=0;
	while(pq.size()){
		pair<int,int>cha=pq.top();
		pq.pop();
		if(du[cha.se]!=cha.fi)continue;
		for(Edge canh:G[cha.se]){
			if(du[cha.second]+canh.w<du[canh.v]){
				du[canh.v]=du[cha.second]+canh.w;
				pq.push({du[canh.v],canh.v});
			}
		}
	}
}
void DIJ2(){
	for(int i=1;i<=n;i++)dv[i]=INF;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
	pq.push({0,v});
	dv[v]=0;
	while(pq.size()){
		pair<int,int>cha=pq.top();
		pq.pop();
		if(dv[cha.se]!=cha.fi)continue;
		for(Edge canh:G[cha.se]){
 
			if(dv[cha.second]+canh.w<dv[canh.v]){
				dv[canh.v]=dv[cha.second]+canh.w;
				pq.push({dv[canh.v],canh.v});
			}
		}
	}
}
void get(int dinh){
	deg[dinh]=trace[dinh].size();
	ok[dinh]=1;
	for(auto v1:trace[dinh]){
		G2[v1.first].pb(dinh);
		if(ok[v1.first]==0){
 
			get(v1.first);
		}
	}
}
signed main()
{
	cin.tie(0),cout.tie(0)->sync_with_stdio(0);
    //freopen(task".inp" , "r" , stdin);
    //freopen(task".out" , "w" , stdout);
    cin>>n>>m>>s>>t>>u>>v;
    for(int i=1;i<=m;i++){
    	int x,y,w;
    	cin>>x>>y>>w;
    	G[x].pb(Edge(x,y,w,i));
    	G[y].pb(Edge(y,x,w,i));
    	ed[i]=Edge(x,y,w,i);
    }
    DIJ();
    DIJ1();
    DIJ2();
    int ans=du[v];
    get(t);
    dp[s]=du[s];
    queue<int>qu;
    qu.push(s);
    vector<int>topo;
    while(qu.size()){
    	int dinh=qu.front();
    	qu.pop();
    	topo.pb(dinh);
    	for(auto canh:G2[dinh]){
    		deg[canh]--;
    		if(deg[canh]==0){
    			qu.push(canh);
    		}
    	}
    }
    for(auto dinh:topo){
    	dp[dinh]=du[dinh];
    }
    for(auto dinh:topo){
    	for(auto den:trace[dinh]){
 
    		dp[dinh]=min(dp[den.fi],dp[dinh]);
    	}
    	ans=min(ans,dp[dinh]+dv[dinh]);
    }
    reverse(topo.begin(),topo.end());
    
    for(auto dinh:topo){
    	dp1[dinh]=dv[dinh];
    }
    for(auto dinh:topo){
    	for(auto den:G2[dinh]){
    		dp1[dinh]=min(dp1[den],dp1[dinh]);
    	}
    	ans=min(ans,dp1[dinh]+dp[dinh]);
    }
    cout<<ans;
    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...