이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
#define int long long
const int maxn = 1e5;
map<int, vector<pair<int, int>>> g[maxn];
map<int, int> dist[maxn];
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
set<pair<pair<int, int>, int>> s;
int n, m;
cin >> n >> m;
for (int i = 0; i < m; ++i) {
int u, v, c, p;
cin >> u >> v >> c >> p;
--u; --v;
g[u][c].push_back({ v, p });
g[v][c].push_back({ u, p });
}
dist[0][0] = 0;
s.insert({ { 0, 0 }, 0 });
auto upd = [&] (int u, int c, int d) {
if (dist[u].count(c)) {
if (dist[u][c] > d) {
dist[u][c] = min(dist[u][c], d);
s.insert({ { dist[u][c], u }, c });
}
} else {
dist[u][c] = d;
s.insert({ { dist[u][c], u }, c });
}
};
while (!s.empty()) {
int v = s.begin()->first.second;
int c = s.begin()->second;
int d = s.begin()->first.first;
s.erase(s.begin());
if (d > dist[v][c]) continue;
if (c == 0) {
for (auto [color, adjacent] : g[v]) {
int sum = 0;
for (auto [u, w] : adjacent) {
sum += w;
}
for (auto [u, w] : adjacent) {
upd(u, 0, d + min(w, sum - w));
upd(u, color, d);
}
}
} else {
int sum = 0;
for (auto [u, w] : g[v][c]) {
sum += w;
}
for (auto [u, w] : g[v][c]) {
upd(u, 0, d + sum - w);
}
}
}
cout << (dist[n - 1].count(0) ? dist[n - 1][0] : -1);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |