제출 #1341578

#제출 시각아이디문제언어결과실행 시간메모리
1341578ttparin_Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
285 ms20224 KiB
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>> ve[100010];
#define int long long
int l1[100010];
int r1[100010];
int l2[100010];
int r2[100010];
int l3[100010];
int r3[100010];
int visitedu[100010];
int distu[100010];
int visitedv[100010];
int distv[100010];
int visiteds[100010];
int dists[100010];
priority_queue<pair<int,int>> pqq;
signed main(){
 int n,m,s,t,u,v;
 cin>>n>>m>>s>>t>>u>>v;
 for(int i=1;i<=m;i++){
    int x,y,w;
    cin>>x>>y>>w;
    ve[x].push_back({y,w});
    ve[y].push_back({x,w});
 }
 pqq.push({0,u});
 while(pqq.empty()==0){
    int w=-pqq.top().first;
    int x=pqq.top().second;
    pqq.pop();
    if(visitedu[x]==1)
        continue;
    visitedu[x]=1;
    distu[x]=w;
    for(auto g:ve[x]){
        if(visitedu[g.first]==0){
            pqq.push({-g.second-w,g.first});
        }
    }
 }
 pqq.push({0,v});
 while(pqq.empty()==0){
    int w=-pqq.top().first;
    int x=pqq.top().second;
    pqq.pop();
    if(visitedv[x]==1)
        continue;
    visitedv[x]=1;
    distv[x]=w;
    for(auto g:ve[x]){
        if(visitedv[g.first]==0){
            pqq.push({-g.second-w,g.first});
        }
    }
 }
 int ans=distu[v];
 pqq.push({-1,s});
        l1[s]=distu[s];
        r1[s]=distv[s];
        l2[s]=distu[s];
        r2[s]=distv[s];
        l3[s]=distu[s];
        r3[s]=distv[s];
 while(pqq.empty()==0){
    int w=-pqq.top().first;
    int x=pqq.top().second;
    pqq.pop();
    if(visiteds[x]==1)
        continue;
	//cout<<x<<" "<<l1[x]<<r1[x]<<" "<<l2[x]<<r2[x]<<" "<<l3[x]<<r3[x]<<endl;cout<<l3[3]<<endl;
	
	visiteds[x]=1;
    dists[x]=w;

        l1[x]=min(l1[x],distu[x]);
        r1[x]=min(r1[x],distv[x]);
        l2[x]=min(l2[x],distu[x]);
        r2[x]=min(r2[x],distv[x]);
        l3[x]=min(l3[x],distu[x]);
        r3[x]=min(r3[x],distv[x]);
		if(l1[x]+r1[x]<l2[x]+r2[x]){
			l2[x]=l1[x];
			r2[x]=r1[x];
		}
		if(l3[x]+r3[x]<l2[x]+r2[x]){
			l2[x]=l3[x];
			r2[x]=r3[x];
		}
        for(auto g:ve[x]){
            if(visiteds[g.first]==0){
                pqq.push({-g.second-w,g.first});
				//cout<<x<<g.first<<g.second<<w<<dists[g.first]<<endl;
                if(dists[g.first]==0){
                    dists[g.first]=g.second+w;
					   //cout<<g.first<<dists[g.first]<<endl;
                    l1[g.first]=l1[x];
                    r1[g.first]=r1[x];
                    l2[g.first]=l2[x];
                    r2[g.first]=r2[x];
                    l3[g.first]=l3[x];
                    r3[g.first]=r3[x];
                }
                else if(dists[g.first]>g.second+w){
                    dists[g.first]=g.second+w;
                    l1[g.first]=l1[x];
                    r1[g.first]=r1[x];
                    l2[g.first]=l2[x];
                    r2[g.first]=r2[x];
                    l3[g.first]=l3[x];
                    r3[g.first]=r3[x];
                }
                else if(dists[g.first]==g.second+w){
                    if(l1[x]<l1[g.first]){
                        l1[g.first]=l1[x];
                        r1[g.first]=r1[x];
                    }
                    else{
                        if(l1[x]==l1[g.first])
                            r1[g.first]=min(r1[g.first],r1[x]);
                    }
                    if(r3[x]<r3[g.first]){
                        r3[g.first]=r3[x];
                        l3[g.first]=l3[x];
                    }
                    else{
                        if(r3[x]==r3[g.first])
                            l3[g.first]=min(l3[g.first],l3[x]);
                    }
                    if(l2[x]+r2[x]<l2[g.first]+r2[g.first]){
                        l2[g.first]=l2[x];
                        r2[g.first]=r2[x];
                    }
                }
                else{}
            }
        }
 }
 for(int i=1;i<=n;i++){
    //cout<<distu[i]<<distv[i]<<" "<<l1[i]<<r1[i]<<" "<<l2[i]<<r2[i]<<" "<<l3[i]<<r3[i]<<endl;
 }
 ans=min(ans,l2[t]+r2[t]);
 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...