Cod sursa(job #2305029)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 18 decembrie 2018 23:03:53
Problema Pitici Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

#define int_pair std::pair <int, int>

struct triple {
    triple(int val = 0, int_pair edge = {0, 0}, int rang = 0) {
        this->val = val;
        this->rang = rang;
        this->edge = edge;
    }   int val, rang; int_pair edge;
    bool operator < (const triple& other) const {
        return val > other.val;
    }
};

#define MAXN 1025
#define inf  1000000005

int N, M, K;
std::vector <int_pair> ADC[MAXN];

inline void AddEdge(int x, int y, int w) {
    ADC[x].push_back({y, w});
}

std::ifstream In("pitici.in");
std::ofstream Out("pitici.out");

int DP[MAXN][MAXN];
bool Seen[MAXN];

void DFS_feat_Dijkstra_and_the_DynamicGang_NewSingle_XDepression_Gonna_Give_it_to_Ya_REMIXED(int vertex = 1) {
    Seen[vertex] = 1;
    for (int i=0; i<K; ++i)
        DP[vertex][i] = inf;
    if (vertex == N) {
        DP[vertex][0] = 0;
        return;
    }

    std::priority_queue <triple> PQ;
    for (auto Edge:ADC[vertex]) {
        if (!Seen[Edge.first]) DFS_feat_Dijkstra_and_the_DynamicGang_NewSingle_XDepression_Gonna_Give_it_to_Ya_REMIXED(Edge.first);
        PQ.push(triple(DP[Edge.first][0] + Edge.second, Edge));
    }

    triple Top;
    for (int i=0; i<K && !PQ.empty(); ++i) {
        Top = PQ.top();
        PQ.pop();

        DP[vertex][i] = Top.val;
        PQ.push(triple(DP[Top.edge.first][Top.rang+1] + Top.edge.second, Top.edge, Top.rang+1));
    }
}

void Citire() {
    In >> N >> M >> K;
    for (int i=0, x, y, w; i<M; ++i)
        In >> x >> y >> w, AddEdge(x, y, w);
}

void Rezolvare() {
    DFS_feat_Dijkstra_and_the_DynamicGang_NewSingle_XDepression_Gonna_Give_it_to_Ya_REMIXED();
    for (int i=0; i<K; ++i)
        Out << DP[1][i] << ' ' ;
}

int main()
{
    Citire();
    Rezolvare();

    return 0;
}