이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#pragma GCC optimize("O2")
#include <fstream>
#include <string>
#include <iostream>
#include <bitset>
#include <math.h>
#include <string>
#include <algorithm>
#include <assert.h>
#include <bits/stdc++.h>
#include <vector>
#include <queue>
#include<stdio.h>
#include<ctype.h>
#define ll long long
using namespace std;
ll n, m;
struct con{
    ll d;
    ll color;
    ll cost;
};
vector<con> cons[100001];
unordered_map<ll, ll> cost[100001];
// how much to convert all nodes of a color to some other color
unordered_map<ll, ll> dist[100001];
unordered_map<ll, ll> used[100001];
//if node with color x was used
int main(){
    cin >> n >> m;
    ll one, two, three, four;
    for (int x = 0; x < m; x++){
        cin >> one >> two >> three >> four;
        cons[one - 1].push_back({two - 1, three, four});
        cons[two - 1].push_back({one - 1, three, four});
    }
    for (int x = 0; x < n; x++){
        for (int y = 0; y < cons[x].size(); y++){
            ll col = cons[x][y].color;
            ll cst = cons[x][y].cost;
            if (cost[x].find(col) == cost[x].end()){
                cost[x][col] = cst;
            } else {
                cost[x][col] += cst;
            }
        }
    }
    priority_queue<tuple<ll, ll, ll>> q;
    //cost, node, color
    q.push(make_tuple(0, 0, 0));
    dist[0][0] = 0;
    while(q.size() > 0){
        ll node;
        ll cst;
        ll color;
        tie(cst, node, color) = q.top();
        q.pop();
        if (used[node].find(color) == used[node].end() && cst == dist[node][color]){
            used[node][color] = 1;
            cst *= -1;
            if (color != 0){
                //we need to go to a node with the same color
                for (auto con: cons[node]){
                    if (con.color == color){
                        if (used[con.d].find(0) == used[con.d].end()){
                            ll ncost = cst + cost[node][color] - con.cost;
                            if (dist[con.d].find(0) == dist[con.d].end() || dist[con.d][0] > ncost){
                                dist[con.d][0] = ncost;
                                q.push(make_tuple(-1 * ncost, con.d, 0));
                            }
                        }
                    }
                }
            }
            else{
                //there are 3 things which we can do
                for (auto con: cons[node]){
                    if (used[con.d].find(con.color) == used[con.d].end()){
                        //dont switch anything and make the next node switch
                        ll ncost = cst;
                        if (dist[con.d].find(con.color) == dist[con.d].end() || dist[con.d][con.color] > ncost && dist[con.d][con.color] < dist[con.d][0] && cost[con.d][con.color] > con.cost){
                            dist[con.d][con.color] = ncost;
                            q.push(make_tuple(-1 * ncost, con.d, con.color));
                        }
                    }
                    if (used[con.d].find(0) == used[con.d].end()){
                        //switch everything but the connection
                        ll ncost = cst + cost[node][con.color] - con.cost;
                        if (dist[con.d].find(0) == dist[con.d].end() || dist[con.d][0] > ncost){
                            dist[con.d][0] = ncost;
                            q.push(make_tuple(-1 * ncost, con.d, 0));
                        }
                        //switch our node only
                        ncost = cst + con.cost;
                        if (dist[con.d].find(0) == dist[con.d].end() || dist[con.d][0] > ncost){
                            dist[con.d][0] = ncost;
                            q.push(make_tuple(-1 * ncost, con.d, 0));
                        }
                    }
                }
            }
        }
    }
    if (dist[n - 1].find(0) == dist[n - 1].end()){
        cout << -1 << "\n";
    }
    else{
        cout << dist[n - 1][0] << "\n";
    }
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:44:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<con>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         for (int y = 0; y < cons[x].size(); y++){
      |                         ~~^~~~~~~~~~~~~~~~
Main.cpp:87:155: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   87 |                         if (dist[con.d].find(con.color) == dist[con.d].end() || dist[con.d][con.color] > ncost && dist[con.d][con.color] < dist[con.d][0] && cost[con.d][con.color] > con.cost){| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |