Cod sursa(job #34699)

Utilizator dominoMircea Pasoi domino Data 21 martie 2007 11:12:33
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#include <vector>
#include <queue>

using namespace std;

#define MAX_N 1024
#define FIN "pitici.in"
#define FOUT "pitici.out"
#define mp make_pair
#define pb push_back
#define f first
#define s second

int N, M, K, pos[MAX_N], add[MAX_N]; char U[MAX_N];
vector < pair<short, int> > G[MAX_N];
vector < int > C[MAX_N];
priority_queue < pair<int, short> > H;

void DFS(int n)
{
    int i, t;
    vector < pair<short, int> >::iterator it;

    U[n] = 1;
    for (it = G[n].begin(); it != G[n].end(); it++)
        if (!U[it->f]) DFS(it->f);

    while (!H.empty()) H.pop();
    for (it = G[n].begin(); it != G[n].end(); it++)
    {
        pos[it->f] = 0; add[it->f] = it->s;
        H.push(mp(-(C[it->f][0]+it->s), it->f));
    }
    C[n].reserve(K);
    for (i = 0; i < K && !H.empty(); i++)
    {
        t = H.top().s; 
        C[n].pb(-H.top().f); H.pop();
        if (++pos[t] < C[t].size())
            H.push(mp(-(C[t][pos[t]]+add[t]), t));
    }
}

int main(void)
{
    int i, a, b, c;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    for (scanf("%d %d %d", &N, &M, &K); M; M--)
    {
        scanf("%d %d %d", &a, &b, &c);
        G[a].pb(mp(b, c));
    }

    C[N].pb(0);
    DFS(1);
    for (i = 0; i < K; i++)
        printf("%d ", C[1][i]);
    printf("\n");

    return 0;
}