Cod sursa(job #638638)

Utilizator deneoAdrian Craciun deneo Data 21 noiembrie 2011 10:40:43
Problema Pitici Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <deque>
#include <queue>
#include <iostream>
using namespace std;

#define pb push_back

struct nod {
    int cost, nodt;
}a;

struct cmp
{
    bool operator()(const nod &a,const nod &b) const
    {
        return a.cost > b.cost;
    }
};

vector<int> gt[1024];
vector<nod> gp[1024];
deque<int> dq;
priority_queue<nod, vector<nod>, cmp> heap;
int nd[1024], ord[1024], pd[1024][1024], dat[1024][1024], poz[1024], n, m, k, p = 0;

void sortare() {
    int i, nod;

    for(i = 1; i <= n; ++i)
        if(nd[i] == 0)
            dq.pb(i);

    while(!dq.empty()) {
        nod = dq[0];
        ord[++p] = nod;
        dq.pop_front();
        for(i = 0; i < gt[nod].size(); ++i) {
            --nd[gt[nod][i]];
            if(nd[gt[nod][i]] == 0)
                dq.pb(gt[nod][i]);
        }
    }
}

int main()
{
    int i, j, x, y, c, ales, t;
    ifstream f("pitici.in");
    ofstream g("pitici.out");
    f >> n >> m >> k;
    for(i = 1; i <= m; ++i) {
        f >> x >> y >> c;
        gt[x].pb(y);
        ++nd[y];
        dat[y][x] = c;
        gp[y].pb(nod{c, x});
    }

    sortare();

    pd[1][0] = 1;

    for(i = 2; i <= n; ++i) {
        memset(poz, 0, sizeof(poz));
        ales = ord[i]; t = 0;
        for(j = 0; j < gp[ales].size(); ++j)
            heap.push(nod{pd[gp[ales][j].nodt][++poz[gp[ales][j].nodt]] + gp[ales][j].cost, gp[ales][j].nodt});
        while(!heap.empty() && t <= k) {
            ++t;
            pd[ales][0] = t;
            a = heap.top();
            heap.pop();
            pd[ales][t] = a.cost;
            ++poz[a.nodt];
            if(pd[a.nodt][0] >= poz[a.nodt]) {
                heap.push(nod{pd[a.nodt][poz[a.nodt]] + dat[ales][a.nodt], a.nodt});
            }
        }
    }

    for(i = 1; i <= k; ++i)
        g << pd[ales][i] << ' ';

    g.close();
    return 0;
}