제출 #833525

#제출 시각아이디문제언어결과실행 시간메모리
833525vjudge1Commuter Pass (JOI18_commuter_pass)C++14
15 / 100
2079 ms56440 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN = 100000;
const ll INF = 1e9*MAXN+7;

vector<pair<ll,ll>> adj[MAXN+7];
vector<ll> trace[MAXN+7];
vector<ll> zero(MAXN+7);
map<pair<ll,ll>,ll> zero_edge;

ll uuu,vvv,nnn;
ll ans=INF;

void dijkstra2(){
	ll n=nnn;
	ll s=uuu;
	ll t=vvv;
	
	vector<ll> d(n+7, INF);
	vector<ll> p(n+7, -1);

    d[s] = 0;
    using pii = pair<ll, ll>;
    priority_queue<pii, vector<pii>, greater<pii>> q;
    q.push({0, s});
    
    
    while (!q.empty()) {
        ll v = q.top().second;
        ll d_v = q.top().first;
        q.pop();
        if (d_v != d[v])
            continue;

        for (auto edge : adj[v]) {
            ll to = edge.first;
            ll len = edge.second;
			if(zero_edge[{v,to}]==1){
				len=0;
			}
			
            if (d[v] + len < d[to]) {
            	
                d[to] = d[v] + len;
                p[to] = v;
                q.push({d[to], to});
                
            }
        }
    }	
	ans=min(ans,d[t]);
	return;
}

vector<ll> path;

void dfs(ll s,ll v){
	if(v==s){
//		for(auto k : path){
//			cout<<k<<" ";
//		}cout<<"\n";	
		dijkstra2();
		return;
	}
	for(auto k : trace[v]){
		if(zero[k]==1)continue;
		path.push_back(v);
		zero[k]=1;
		
		zero_edge[{v,k}]=1;
		zero_edge[{k,v}]=1;
		
		dfs(s,k);
		
		path.pop_back();
		zero[k]=0;
		zero_edge[{v,k}]=0;
		zero_edge[{k,v}]=0;
	}
	return;
}


void dijkstra1(ll n, ll s, ll t){
	vector<ll> d(n+7, INF);
	vector<ll> p(n+7, -1);

    d[s] = 0;
    using pii = pair<ll, ll>;
    priority_queue<pii, vector<pii>, greater<pii>> q;
    q.push({0, s});
    
    while (!q.empty()) {
        ll v = q.top().second;
        ll d_v = q.top().first;
        q.pop();
        if (d_v != d[v])
            continue;

        for (auto edge : adj[v]) {
            ll to = edge.first;
            ll len = edge.second;

            if (d[v] + len < d[to]) {
            	
                d[to] = d[v] + len;
                p[to] = v;
                q.push({d[to], to});
                
                trace[to].clear();
                trace[to].push_back(v);
                
            }else if(d[v]+len == d[to]){
            	trace[to].push_back(v);
			}
        }
    }
	return;
}

int main(){
	ll n,m,s,t,u,v;
	cin>>n>>m;
	cin>>s>>t;
	cin>>u>>v;
	
	for(ll i=0; i<m; i++){
		ll a,b,w;
		cin>>a>>b>>w;
		adj[b].push_back({a,w});
		adj[a].push_back({b,w});
	}
	
	uuu=u;
	vvv=v;
	nnn=n;
	
	dijkstra1(n, s, t);
	dfs(s, t);
	
	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...