| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1299803 | StefanSebez | Commuter Pass (JOI18_commuter_pass) | C11 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
#define mp make_pair
const int N=1e5+50,inf=1e9;
const ll INF=1e18;
vector<pair<int,int>>E[N];
int n,m,S,T,U,V;
void Dijkstra(int U,vector<ll>&dist){
dist.assign(n+1,INF);
priority_queue<pair<ll,int>>pq;
dist[U]=0;
pq.push({-dist[U],U});
while(!pq.empty()){
auto [temp,u]=pq.top();pq.pop();
if(-temp!=dist[u])continue;
for(auto [v,w]:E[u]){
if(dist[v]>dist[u]+w){
dist[v]=dist[u]+w;
pq.push({-dist[v],v});
}
}
}
}
vector<int>E1[N];
int main(){
scanf("%i%i%i%i%i%i",&n,&m,&S,&T,&U,&V);
for(int i=1;i<=m;i++){
int u,v,w;scanf("%i%i%i",&u,&v,&w);
E[u].pb({v,w});
E[v].pb({u,w});
}
vector<ll>dist;
Dijkstra(S,dist);
for(int u=1;u<=n;u++){
for(auto [v,w]:E[u]){
if(dist[v]==dist[u]+w){
E1[u].pb(v);
}
}
}
int deg[n+10]={0};
for(int i=1;i<=n;i++) for(auto j:E1[i]) deg[j]++;
queue<int>kju;
for(int i=1;i<=n;i++) if(deg[i]==0) kju.push(i);
vector<int>topsort;
while(!kju.empty()){
int u=kju.front();kju.pop();
topsort.pb(u);
for(auto i:E1[u]){
deg[i]--;
if(deg[i]==0) kju.push(i);
}
}
vector<ll>distU,distV;
Dijkstra(U,distU);
Dijkstra(V,distV);
vector<int>revtopsort=topsort;
reverse(revtopsort.begin(),revtopsort.end());
ll res=distV[U];
ll dp[n+10];bool moze[n+10]={0};
for(auto u:revtopsort){
dp[u]=distV[u];
if(u==T)moze[u]=true;
for(auto i:E1[u])if(moze[i]){
dp[u]=min(dp[u],dp[i]);
moze[u]=true;
}
if(moze[u])res=min(res,distU[u]+dp[u]);
}
for(auto u:revtopsort){
dp[u]=distU[u];
moze[u]=false;
if(u==T)moze[u]=true;
for(auto i:E1[u])if(moze[i]){
dp[u]=min(dp[u],dp[i]);
moze[u]=true;
}
if(moze[u])res=min(res,distV[u]+dp[u]);
}
printf("%lld\n",res);
return 0;
}
