#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
const int inf=1e15+10;
vector<pair<int,int>>adj[maxn];
int dist[maxn][4], n, marc[maxn], best, used[maxn][4];
set<pair<int,int>>aux[maxn];
//dist[i][?] 0-> dist a partir do u, 1-> dist a partir do v, 2-> dist a partir do s, 3-> dist a paritr do t
void dijkstra(int x, int t,int dir){
for(int i=1;i<=n;i++) dist[i][t]=inf;
dist[x][t]=0;
set<pair<int,int>>s;
for(int i=1;i<=n;i++) s.insert({dist[i][t],i});
while(!s.empty()){
auto f=s.begin();
int u=f->second;
used[u][t]++;
s.erase(f);
for(auto p : adj[u]){
int viz=p.first, w=p.second;
if(marc[u]&&marc[viz]&&dist[u][dir]+w==dist[viz][dir]&&dist[u][t]<dist[viz][t]){
s.erase({dist[viz][t],viz});
dist[viz][t]=dist[u][t];
s.insert({dist[viz][t],viz});
}
if(dist[u][t]+w<dist[viz][t]){
s.erase({dist[viz][t],viz});
dist[viz][t]=dist[u][t]+w;
s.insert({dist[viz][t],viz});
}
}
}
}
signed main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
int m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v;
for(int i=1;i<=m;i++){
int a, b, c; cin >> a >> b >> c;
adj[a].push_back({b,c});
adj[b].push_back({a,c});
}
dijkstra(s,2,0);
dijkstra(t,3,0);
best=dist[t][2];
for(int i=1;i<=n;i++) if(dist[i][2]+dist[i][3]==best) marc[i]++;
dijkstra(u,0,2);
dijkstra(u,1,3);
cout << min(dist[v][0],dist[v][1]) << endl;
return 0;
}
# | 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... |