이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 201;
int n, m;
const int MAX_ALL_N = 405;
vector<pair<int, int>> sasiedzi[MAXN];
bool odwiedzona[MAX_ALL_N];
int dijkstra_odleglosci[MAX_ALL_N];
int dijkstra(int a, int b) { //z a do b
for (int i = 0; MAX_ALL_N > i; i++) {
odwiedzona[i] = false;
dijkstra_odleglosci[i] = -1;
}
priority_queue<pair<int, int>> kopiec;
kopiec.push({0, a});
pair<int, int> p1;
int aktl_v, aktl_koszt;
while (!kopiec.empty()) {
p1 = kopiec.top();
kopiec.pop();
aktl_v = -p1.second;
aktl_koszt = -p1.first;
if (odwiedzona[aktl_v]) continue;
else dijkstra_odleglosci[aktl_v] = aktl_koszt;
for (pair<int, int> sasd: sasiedzi[aktl_v]) {
if (odwiedzona[sasd.first]) continue;
kopiec.push({-(aktl_koszt + sasd.second), sasd.first});
}
}
return dijkstra_odleglosci[b];
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
int w1, w2, w3, w4;
for (int i = 0; m > i; i++) {
cin >> w1 >> w2 >> w3 >> w4;
sasiedzi[w1].push_back({w2, w3});
sasiedzi[w1 + MAXN].push_back({w2 + MAXN, w3});
sasiedzi[w2].push_back({w1 + MAXN, w3 + w4});
}
int wynik = 2000000000;
int odl_do_n = dijkstra(1, n);
int odl_n_do_1 = dijkstra(n, 1);
int odl_do_n_prim = dijkstra(1, n + MAXN);
int odl_n_prim_do_1_prim = dijkstra(n + MAXN, 1 + MAXN);
if (odl_do_n != -1 && odl_n_do_1 != -1) {
wynik = odl_do_n + odl_n_do_1;
} if (odl_do_n_prim != -1 && odl_n_prim_do_1_prim != -1) {
wynik = min(wynik, odl_do_n_prim + odl_n_prim_do_1_prim);
}
if (wynik == 2000000000) wynik = -1;
cout << wynik;
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... |