이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <algorithm>
#include <map>
#include <fstream>
#include <bitset>
#include <unordered_map>
#include <stack>
#include <list>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef map<int, int> mii;
typedef map<int, string> mis;
typedef map<string, int> msi;
typedef set<int> si;
typedef set<ll> sl;
typedef map<ll, ll> mll;
typedef queue<int> qi;
typedef queue<ii> qii;
typedef vector<string> vs;
typedef pair<ll, ll> iil;
typedef priority_queue<int> pqi;
typedef priority_queue<ii> pqii;
typedef priority_queue<ll> pqil;
typedef priority_queue<iil> pqiil;
typedef vector<iil> viil;
typedef vector<vi> vvi;
typedef long double ld;
typedef pair<int, ii> iii;
typedef pair<iil, ll> iiil;
typedef vector<pair<pair<int,int>,int> > viii;
typedef vector<pair<pair<ll,ll>,ll> > viiil;
typedef vector<vl> vvl;
#define pb push_back
#define mp make_pair
#define rep(i, n) for (int i = 0 ; i < n ; i++)
#define rrep(i, m, n) for (int i = m ; i < n ; i++)
#define per(i, n) for (int i = n - 1 ; i >= 0 ; i--)
#define perr(i, m, n) for (int i = n - 1 ; i >= m ; i--)
#define INF 2000000000
#define int long long
ll MOD = 1000000007;
viil adj[100005];
vl ans[100005];
ll dpU[100005];
ll dpV[100005];
ll distU[100005];
ll distV[100005];
ll distS[100005];
ll tans;
void dfs(int n) {
tans = min(tans, dpU[n] + distV[n]);
tans = min(tans, dpV[n] + distU[n]);
//cout << n << " " << dpU[n] << " " << dpV[n] << " " << distV[n] << " " << distU[n] << endl;
/*cout << n << endl;
for (ll a : ans[n]) {
cout << a << " ";
}
cout << endl;*/
for (ll a : ans[n]) {
dfs(a);
}
}
void gen(int n, int m) {
cout << n << " " << m << endl;
cout << rand()%n+1 << " " << rand()%n+1 << endl;
cout << rand()%n+1 << " " << rand()%n+1 << endl;
rep(i, m) {
int a = rand()%n+1;
int b = rand()%n+1;
while (b == a) {
b = rand()%n+1;
}
int c = rand()%1000000000;
cout << a << " " << b << " " << 1 << endl;
}
}
void solve() {
//gen(10000, 20000);
ll n, m;
cin >> n >> m;
ll s, t;
cin >> s >> t;
s--; t--;
ll u, v;
cin >> u >> v;
u--; v--;
rep(i, m) {
int a, b, c;
cin >> a >> b >> c;
a--; b--;
adj[a].pb({b, c});
adj[b].pb({a, c});
}
pqiil q;
q.push({0, u});
rep(i, n) distU[i] = 100000000000000000;
while (q.size()) {
iil inf = q.top();
q.pop();
ll ds = -inf.first;
ll vt = inf.second;
if (ds > distU[vt]) continue;
distU[vt] = ds;
for (iil a : adj[vt]) {
if ((ds + a.second) <= distU[a.first]) {
q.push({-(ds + a.second), a.first});
}
}
}
pqiil q2;
q2.push({0, v});
rep(i, n) distV[i] = 100000000000000000;
while (q2.size()) {
iil inf = q2.top();
q2.pop();
ll ds = -inf.first;
ll vt = inf.second;
if (ds > distV[vt]) continue;
distV[vt] = ds;
for (iil a : adj[vt]) {
if (ds + a.second <= distV[a.first]) {
q2.push({-(ds + a.second), a.first});
}
}
}
priority_queue<pair<ll, pair<ll, ll>>> q3;
q3.push({0, {s, -1}});
rep(i, n) distS[i] = 100000000000000000;
rep(i, n) dpU[i] = 100000000000000000;
rep(i, n) dpV[i] = 100000000000000000;
while (q3.size()) {
pair<ll, pair<ll, ll>> inf = q3.top();
q3.pop();
ll ds = -inf.first;
ll vt = inf.second.first;
ll ls = inf.second.second;
if (ds > distS[vt]) continue;
distS[vt] = ds;
if (ls != -1) {
ans[vt].pb(ls);
}
if (ls != -1) {
dpU[vt] = min(dpU[vt], dpU[ls]);
dpV[vt] = min(dpV[vt], dpV[ls]);
}
dpU[vt] = min(dpU[vt], distU[vt]);
dpV[vt] = min(dpV[vt], distV[vt]);
//cout << vt << " " << dpV[vt] << endl;
for (iil a : adj[vt]) {
if (ds + a.second <= distS[a.first]) {
q3.push({-(ds + a.second), {a.first, vt}});
}
}
}
tans = 100000000000000000;
dfs(t);
tans = min(tans, distU[v]);
cout << tans << endl;
}
void querySolve() {
int t;
cin >> t;
for (int i = 0 ; i < t ; i++) {
solve();
}
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
solve();
//querySolve();
}
컴파일 시 표준 에러 (stderr) 메시지
commuter_pass.cpp: In function 'void gen(long long int, long long int)':
commuter_pass.cpp:93:10: warning: unused variable 'c' [-Wunused-variable]
93 | int c = rand()%1000000000;
| ^
# | 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... |