This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pll pair<ll,ll>
#define ppll pair<pll, ll>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;
#define LOCALIO "C:/Users/admin/Documents/Code/"
ll n; vector <ll> Dis[2];
vector <pll> A[100005];
priority_queue <pll, vector <pll>, greater<pll>> q;
priority_queue <ppll, vector <ppll>, greater<ppll>> q2;
vector <ll> dijkstra(ll s)
{
vector <ll> dis;
dis.assign(n+1, 1e18);
dis[s]=0; q.push({0, s});
while (!q.empty())
{
ll u=q.top().se, disu=q.top().fi; q.pop();
if (dis[u]!=disu)
continue;
for (pll i:A[u])
{
ll v=i.se, w=i.fi;
if (dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
q.push({dis[v], v});
}
}
}
return dis;
}
vector <pll> dijkstra2(ll s, ll id)
{
vector <pll> dis;
dis.assign(n+1, {1e18, 1e18});
dis[s]={0, Dis[id][s]}; q2.push({dis[s], s});
while(!q2.empty())
{
ll u=q2.top().se;
pll disu=q2.top().fi; q2.pop();
if (disu!=dis[u])
continue;
// cout << u << " " << disu.fi << " " << disu.se << "\n";
for (pll i:A[u])
{
ll v=i.se, w=i.fi;
if (dis[u].fi+w<dis[v].fi)
{
dis[v].fi=dis[u].fi+w;
dis[v].se=min(Dis[id][v], dis[u].se);
q2.push({dis[v], v});
}
else if (dis[u].fi+w<=dis[v].fi)
{
if (dis[v].se>dis[u].se)
{
dis[v].se=dis[u].se;
q2.push({dis[v], v});
}
}
}
}
// for (ll i=1; i<=n; i++)
// cout << dis[i].fi << " " << dis[i].se << "\n";
return dis;
}
int main()
{
#ifdef LOCAL
freopen( LOCALIO "input.txt","r",stdin) ;
freopen( LOCALIO "output.txt","w",stdout) ;
#endif
ios_base::sync_with_stdio(NULL); cin.tie(nullptr); cout.tie(nullptr);
// freopen("FIBONACCI.inp","r",stdin);
// freopen("FIBONACCI.out","w",stdout);
ll m, s, t, u, v;
cin >> n >> m >> s >> t >> u >> v;
for (ll i=1; i<=m; i++)
{
ll u, v, w; cin >> u >> v >> w;
A[u].pb({w, v}); A[v].pb({w, u});
}
Dis[0]=dijkstra(u);
Dis[1]=dijkstra(v);
ll ans=Dis[0][v];
vector <pll> s_u=dijkstra2(s, 0);
vector <pll> s_v=dijkstra2(s, 1);
vector <pll> t_u=dijkstra2(t, 0);
vector <pll> t_v=dijkstra2(t, 1);
for (ll i=1; i<=n; i++)
{
if (s_u[i].fi+t_v[i].fi!=s_u[t].fi)
continue;
ans=min(ans, s_u[i].se+t_v[i].se);
ans=min(ans, s_v[i].se+t_u[i].se);
}
cout << ans;
}
| # | 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... |