이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<ll, int>
#define fi first
#define se second
const int ar = 1e5 + 5;
int n, m, u, v, s, t;
ll dp[ar][2], dis[ar];
vector<pii> adj[ar];
int x[ar << 1], y[ar << 1], w[ar << 1];
void dijktra(int u, int c) {
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push({0, u});
dp[u][c] = 0;
while(q.size()) {
int vt = q.top().se; ll kc = q.top().fi; q.pop();
// cout << vt << ' ' << kc << '\n';
if(kc > dp[vt][c]) continue;
for(auto x : adj[vt]) {
if(dp[x.se][c] > dp[vt][c] + x.fi) {
dp[x.se][c] = dp[vt][c] + x.fi;
q.push({dp[x.se][c], x.se});
}
}
}
}
void dijktra2(int u) {
memset(dis, 0x3f, sizeof(dis));
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push({0, u});
dis[u] = 0;
while(q.size()) {
int vt = q.top().se; ll kc = q.top().fi; q.pop();
if(kc > dis[vt]) continue;
for(auto x : adj[vt]) {
ll cost = x.fi;
if(dp[x.se][0] + dp[vt][1] + x.fi == dp[t][0]) cost = 0;
if(dp[vt][0] + dp[x.se][1] + x.fi == dp[v][0]) cost = 0;
if(dis[x.se] > dis[vt] + cost) {
dis[x.se] = dis[vt] + cost;
q.push({dis[x.se], x.se});
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m >> s >> t >> u >> v;
for(int i = 1; i <= m; ++i) {
cin >> x[i] >> y[i] >> w[i];
adj[x[i]].push_back({w[i], y[i]});
adj[y[i]].push_back({w[i], x[i]});
}
memset(dp, 0x3f, sizeof(dp));
dijktra(s, 0);
dijktra(t, 1);
dijktra2(u);
// for(int i = 1; i <= n; ++i) {
// cout << i << ' ' << dp[i][0] << ' ' << dp[i][1] << '\n';
// }
cout << dis[v];
}
| # | 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... |