Submission #1175078

#TimeUsernameProblemLanguageResultExecution timeMemory
1175078bluevioletRobot (JOI21_ho_t4)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge {
    int to, color, cost;
};

struct State {
    int node, cost;
    bool operator>(const State &other) const {
        return cost > other.cost;
    }
};

const int INF = 1e9;
int N, M;
vector<Edge> adj[1005];
map<int, vector<int>> color_adj[1005];

int dijkstra() {
    priority_queue<State, vector<State>, greater<State>> pq;
    vector<int> minCost(N + 1, INF);
    pq.push({1, 0});
    minCost[1] = 0;

    while (!pq.empty()) {
        State cur = pq.top();
        pq.pop();
        int u = cur.node, cur_cost = cur.cost;

        if (u == N) return cur_cost;

        for (auto &edge : adj[u]) {
            int v = edge.to, c = edge.color, p = edge.cost;

            if (color_adj[u][c].size() > 1) continue; // Ambiguous color

            if (cur_cost + p < minCost[v]) {
                minCost[v] = cur_cost + p;
                pq.push({v, minCost[v]});
            }
        }
    }

    return -1;
}

int main() {
    cin >> N >> M;
    vector<tuple<int, int, int, int>> edges;

    for (int i = 0; i < M; i++) {
        int A, B, C, P;
        cin >> A >> B >> C >> P;
        edges.push_back({A, B, C, P});
        adj[A].push_back({B, C, P});
        adj[B].push_back({A, C, P});
        color_adj[A][C].push_back(B);
        color_adj[B][C].push_back(A);
    }

    int result = dijkstra();
    cout << result << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...