Cod sursa(job #3276177)

Utilizator db_123Balaban David db_123 Data 12 februarie 2025 20:42:36
Problema Pitici Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cassert>
#include <set>

using namespace std;

ifstream cin("pitici.in");
ofstream cout("pitici.out");

struct Info {
    int16_t node2;
    int16_t cost;
    Info() = default;
    Info(int16_t node2, int16_t cost) : node2(node2), cost(cost) {}
};

struct Info2 {
    int16_t node;
    int16_t dim;
    int cost;
    Info2() = default;
    Info2(int16_t node, int16_t dim, int val) : node(node), dim(dim), cost(val) {}
    bool operator<(Info2 a2) const {
        if (cost == a2.cost) {
            if (dim == a2.dim) {
                return node < a2.node;
            }
            return dim < a2.dim;
        }
        return cost < a2.cost;
    }
};

int n, m, k;
vector<vector<Info>> graph, rev_graph;
vector<vector<int>> vst;
vector<vector<int>> dist;

void read() {
    cin >> n >> m >> k;
    graph.resize(n + 1);
    rev_graph.resize(n + 1);
    for (int i = 1; i <= m; i++) {
        int16_t a, b, c;
        cin >> a >> b >> c;
        graph[a].emplace_back(Info(b, c));
        rev_graph[b].emplace_back(Info(a, c));
    }
}

void solve() {
    vector<int16_t> in_degree(n + 1);
    for (int i = 1; i <= n; i++) {
        for (auto it : graph[i]) {
            in_degree[it.node2] ++;
        }
    }

    dist.resize(n + 1, vector<int>(k + 1, 1e9));
    vst.resize(n + 1);
    queue<int16_t> q;
    dist[1][1] = 0;
    q.push(1);
    int16_t tp;
    while (!q.empty()) {
        tp = q.front();
        q.pop();

        for (auto it : graph[tp]) {
            in_degree[it.node2] --;
        }

        for (auto it : graph[tp]) {
            if (in_degree[it.node2] > 0) {
                continue;
            }

            set<Info2> st;
            vector<int> additional_cost(n + 1);
            for (auto it2 : rev_graph[it.node2]) {
                st.insert(Info2(it2.node2, 1, dist[it2.node2][1] + it2.cost));
                additional_cost[it2.node2] = it2.cost;
            }
            
            int cnt = 1;
            Info2 tp2;
            while (cnt <= k) {
                tp2 = (*st.begin());
                st.erase(st.begin());

                dist[it.node2][cnt ++] = tp2.cost;

                if (tp2.dim == k) {
                    continue;
                }
                st.insert(Info2(tp2.node, tp2.dim + 1, dist[tp2.node][tp2.dim + 1] + additional_cost[tp2.node]));
            }
            q.push(it.node2);
        }
    }

    for (int i = 1; i <= k; i++) {
        cout << dist[n][i] << " ";
    }
}

int main() {

    read();
    solve();
    return 0;
}