Cod sursa(job #372732)

Utilizator filipbFilip Cristian Buruiana filipb Data 11 decembrie 2009 14:55:39
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <queue>

using namespace std;

#define PII pair<int, int>
#define mp make_pair
#define pb push_back
#define NMax 1024
#define INF 999999999
#define f first
#define s second

int N, M, K, calc[NMax];
priority_queue< PII, vector<PII>, greater<PII> > Q;
vector< PII > G[NMax];
int dst[NMax][NMax], dep[NMax], cost[NMax]; 

void df(int n)
{
    int i, sz, vec, nd;

    if (calc[n] == 1)
        return ;
        
    for (sz = G[n].size(), i = 0; i < sz; ++i)
        df(G[n][i].f);

    while (!Q.empty())
        Q.pop();
    
    for (i = 0; i < sz; ++i)
    {
        vec = G[n][i].f; 
        dep[vec] = 1;
        cost[vec] = G[n][i].s;
        Q.push( mp(cost[vec] + dst[vec][1], vec) );
    }
        
    int nr = 0;
    for (i = 1; i <= K && !Q.empty(); ++i)
    {
        PII root = Q.top();
        Q.pop();
        if (root.f >= INF)
            break;
        dst[n][++nr] = root.f;
        ++dep[root.s];
        if (dep[root.s] <= K)
        {
            nd = root.s;
            Q.push( mp(cost[nd] + dst[nd][dep[nd]], nd) );
        }
    }
    
    calc[n] = 1;
}

int main()
{
    int i, j, u, v, c;
    
    freopen("pitici.in", "r", stdin);
    freopen("pitici.out", "w", stdout);
    
    scanf("%d %d %d", &N, &M, &K);
    for (; M; --M)
    {
        scanf("%d %d %d", &u, &v, &c);
        G[u].pb( mp(v, c) );
    }
    
    for (i = 1; i <= N; ++i)
        for (j = 1; j <= K; ++j)
            dst[i][j] = INF;
    dst[N][1] = 0;
    df(1);

    for (i = 1; i <= K; ++i)
        printf("%d ", dst[1][i]);
    printf("\n");
    
    return 0;
}