This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define MX 100000
#define ll long long
using namespace std;
struct Edge {
    int color, next;
    ll price;
    Edge (int _color = 0, int _next = 0, ll _price = 0) {
        color = _color, next = _next, price = _price;
    }
};
int n, m;
map<int, vector<Edge>> adj[MX + 1];
ll dp[MX + 1];
map<int, ll> dp2[MX + 1], sum[MX + 1];
int main() {;
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v, c;
		ll p;
		cin >> u >> v >> c >> p;
		adj[u][c].push_back(Edge(c, v, p));
		adj[v][c].push_back(Edge(c, u, p));
		sum[u][c] += p;
		sum[v][c] += p;
	}
	fill(dp + 1, dp + 1 + n, INF);
	dp[1] = 0;
	priority_queue<tuple<ll, int, int>> pq;
	pq.push({0, 1, 0});
	while (pq.size()) {
		ll cost;
		int node, c;
		tie(cost, node, c) = pq.top();
		pq.pop();
		if (c) {
			if (dp2[node][c] != -cost) continue;
			for (Edge i : adj[node][c]) {
				// We can't flip i in this case
				ll case1 = sum[node][c] - i.price;
				if (case1 - cost < dp[i.next]) {
					dp[i.next] = case1 - cost;
					pq.push({-dp[i.next], i.next, 0});
				}
			}
		} else {
			if (dp[node] != -cost) continue;
			for (auto& i : adj[node]) {
				for (Edge j : i.second) {
					// Case 1: We don't flip j
					ll case1 = sum[node][j.color] - j.price - cost;
					if (case1 < dp[j.next]) {
						dp[j.next] = case1;
						pq.push({-dp[j.next], j.next, 0});
					}
					// Case 2: We flip j but not another edge of the same colour
					ll case2 = j.price - cost;
					if (case2 < dp[j.next]) {
						dp[j.next] = case2;
						pq.push({-dp[j.next], j.next, 0});
					}
					// Case 3: We flip j and another edge of the same colour
					ll case3 = -cost;
					if (!dp2[j.next].count(j.color) || case3 < dp2[j.next][j.color]) {
						dp2[j.next][j.color] = case3;
						pq.push({-dp2[j.next][j.color], j.next, j.color});
					}
				}
			}
		}
	}
	cout << (dp[n] >= INF ? -1 : dp[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... |