Cod sursa(job #1838920)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 1 ianuarie 2017 23:33:26
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <queue>
#include <vector>
#define MAXN 1050

using namespace std;

int n, m, k;
struct vecin
{
    int y, cost;
    vecin(int y = 0, int cost = 0) : y(y), cost(cost) { }
};
vector<vecin> graf[MAXN];
int viz[MAXN], fin[MAXN];

void read()
{
    scanf("%d %d %d", &n, &m, &k);
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        scanf("%d %d %d", &x, &y, &z);
        graf[x].push_back(vecin(y, z));
    }
}

vector<int> succ[MAXN];

struct elem
{
    int od, ind, cost;
    elem(int od = 0, int ind = 0, int cost = 0) : od(od), ind(ind), cost(cost) { }
    int getMass()
    {
        return succ[od][ind] + cost;
    }
    bool operator()(elem e, elem f)
    {
        return e.getMass() > f.getMass();
    }
};
priority_queue<elem, vector<elem>, elem> heap;

void solve(int nod)
{
    viz[nod] = 1;
    if (nod == n) {
        fin[nod] = 1;
        succ[nod].push_back(0);
    }
    for (vecin v : graf[nod]) {
        if (viz[v.y]) continue;
        solve(v.y);
    }
    while (!heap.empty()) heap.pop();
    for (vecin v : graf[nod]) {
        if (fin[v.y]) {
            fin[nod] = 1;
            heap.push(elem(v.y, 0, v.cost));
        }
    }
    for (int i = 1; i <= k && !heap.empty(); i++) {
        elem t = heap.top();
        heap.pop();
        succ[nod].push_back(t.getMass());
        if (t.ind < succ[t.od].size()-1)
            heap.push(elem(t.od, t.ind+1, t.cost));
    }
}

void afisare()
{
    if (succ[1].size() != k)
        fprintf(stderr, "ERROR");
    for (int i = 0; i < k; i++) {
        printf("%d ", succ[1][i]);
    }
}

int main()
{
    freopen("pitici.in", "r", stdin);
    freopen("pitici.out", "w", stdout);

    read();
    solve(1);
    afisare();
}