이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = 1e18 + 3;
const int N = 1e5 + 3;
class cmt
{
public:
bool operator() (pair<int, ll> a, pair<int, ll> b){
return a.second > b.second;
}
};
int s, t, v, u, n, m;
vector<pair<int, ll>> g[N];
vector<int> dag1[N], dag2[N];
ll dpv[N], dpu[N];
vector<ll> ds, dv, du;
bool us[N];
vector<ll> djikstra(int S){
vector<ll> d(N, INF);
d[S] = 0;
priority_queue<pair<int, ll>, vector<pair<int, ll>>, cmt> q;
q.push({S, 0});
while(!q.empty()){
auto cur = q.top();
q.pop();
int node = cur.first;
ll dist = cur.second;
if(dist != d[node]) continue;
for(auto i : g[node]){
if(dist + i.second < d[i.first]){
d[i.first] = dist + i.second;
q.push({i.first, dist + i.second});
}
}
}
return d;
}
void dfs(int S){
us[S] = true;
for(auto i : g[S]){
if(us[i.first]) continue;
if(ds[S] - i.second == ds[i.first]){
dag1[S].push_back(i.first);
dag2[i.first].push_back(S);
dfs(i.first);
}
}
}
ll ans = INF;
void dfsp1(int S){
us[S] = true;
dpu[S] = du[S];
dpv[S] = dv[S];
for(auto i : dag1[S]){
if(!us[i]){
dfsp1(i);
}
if(min(dpu[i], du[S]) + min(dpv[i], dv[S]) <= dpu[S] + dpv[S]){
dpu[S] = min(du[S], dpu[i]);
dpv[S] = min(dv[S], dpv[i]);
}
}
// cout << dpv[S] << " " << dpu[S] << " " << S << " !\n";
ans = min(ans, dpv[S] + dpu[S]);
}
void dfsp2(int S){
us[S] = true;
dpu[S] = du[S];
dpv[S] = dv[S];
for(auto i : dag2[S]){
if(!us[i]){
dfsp2(i);
}
if(min(dpu[i], du[S]) + min(dpv[i], dv[S]) <= dpu[S] + dpv[S]){
dpu[S] = min(du[S], dpu[i]);
dpv[S] = min(dv[S], dpv[i]);
}
}
// cout << dpv[S] << " " << dpu[S] << " " << S << " !\n";
ans = min(ans, dpv[S] + dpu[S]);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> s >> t >> v >> u;
for(int i = 0; i < m; ++i){
int a, b;
ll c;
cin >> a >> b >> c;
g[a].push_back({b, c});
g[b].push_back({a, c});
}
ds = djikstra(s);
du = djikstra(u);
dv = djikstra(v);
dfs(t);
for(int i = 0; i < N; ++i){
dpu[i] = dpv[i] = INF;
us[i] = false;
}
dfsp1(t);
for(int i = 0; i < N; ++i){
dpu[i] = dpv[i] = INF;
us[i] = false;
}
dfsp2(s);
cout << min(ans, dv[u]);
}
# | 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... |