#include <bits/stdc++.h>
using namespace std;
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vb = vector<bool>;
using vll = vector<ll>;
using ii = pair<int, int>;
using iii = tuple<int, int, ll>;
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
const ll INF = 1e18;
struct Edge {
int u, v, c;
ll p;
};
template<typename T>
int pos(vector<T> &vals, T x) {
return int(lower_bound(all(vals), x) - begin(vals));
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
vector<Edge> graph(m);
vector<vector<iii>> adj(n);
vector<vi> colors(n, vi(1, -1));
vector<vll> sum(n);
for (auto &[u, v, c, p] : graph) {
cin >> u >> v >> c >> p;
--u, --v;
colors[u].pb(c);
colors[v].pb(c);
adj[u].eb(c, v, p);
adj[v].eb(c, u, p);
}
forn(u, n) {
sort(all(adj[u]));
sort(all(colors[u]));
colors[u].erase(unique(all(colors[u])), end(colors[u]));
sum[u].assign(sz(colors[u]), 0LL);
}
for (auto &[u, v, c, p] : graph) {
sum[u][pos(colors[u], c)] += p;
sum[v][pos(colors[v], c)] += p;
}
vector<vll> dist(n);
forn(u, n) dist[u].assign(sz(colors[u]), INF);
priority_queue<tuple<ll, int, int>> pq;
auto PUSH = [&](int u, int c, ll d) {
if (d < dist[u][c]) {
dist[u][c] = d;
pq.emplace(-dist[u][c], u, c);
}
};
PUSH(0, 0, 0LL);
while (!pq.empty()) {
auto [d, u, c] = pq.top();
pq.pop(); d *= -1;
if (dist[u][c] != d) continue;
if (c != 0) {
int lo = pos(adj[u], iii{colors[u][c], 0, 0});
int hi = pos(adj[u], iii{colors[u][c] + 1, 0, 0});
forsn(id, lo, hi) {
auto [_, v, p] = adj[u][id];
PUSH(v, 0, d + sum[u][c] - p);
}
} else {
for (auto [k, v, p] : adj[u]) {
PUSH(v, pos(colors[v], k), d);
PUSH(v, 0, d + min(p, sum[u][pos(colors[u], k)] - p));
}
}
}
if (dist[n - 1][0] == INF) cout << "-1\n";
else cout << dist[n - 1][0] << '\n';
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... |