#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;
}
Compilation message (stderr)
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:31:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
31 | scanf("%i%i%i%i%i%i",&n,&m,&S,&T,&U,&V);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:33:24: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
33 | int u,v,w;scanf("%i%i%i",&u,&v,&w);
| ~~~~~^~~~~~~~~~~~~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |