Cod sursa(job #34404)

Utilizator filipbFilip Cristian Buruiana filipb Data 20 martie 2007 18:43:44
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define INF 1000000001
#define id first
#define cost second
#define NMax 1025

using namespace std;

typedef pair<int, int> pereche;

int N, K, uz[NMax];
vector< pereche > G[NMax];

int D[NMax][NMax], f[NMax], C[NMax];
priority_queue < pereche > H;

bool operator< (const pereche& a, const pereche& b)
{
     if (a.second != b.second) return (a.second > b.second);
     return (a.first < b.first);
}

void dfs(int nod)
{
     int i, nr, p, x;
     vector< pair<int, int> >::iterator it;

     for (i = 1; i <= K+1; i++)
         D[nod][i] = INF;
     if (G[nod].size() == 0)
     { D[nod][1] = (nod != N)*INF; return ; }
     uz[nod] = 1;
     
     for (it = G[nod].begin(); it != G[nod].end(); it++)
         if (!uz[it->id])
            dfs(it->id);
     
     while (!H.empty()) H.pop();
     memset(f, 0, sizeof(f));
     memset(C, 0, sizeof(C));

     for (it = G[nod].begin(), nr = 1; it != G[nod].end(); it++, nr++)
     {
         H.push( make_pair( - D[it->id][1] - it->cost, it->id) );
         f[it->id] = 1; C[it->id] = it->cost;
     }

     p = 0;
     while (p < K)
     {
           x = (H.top()).first; nr = (H.top()).second;

           if (x <= -INF) return ;
           
           D[nod][++p] = - x;
           H.pop();
           
           H.push( make_pair(- D[nr][++f[nr]] - C[nr], nr) );     

     }
     
}

int main(void)
{
    int M, i, 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].push_back( make_pair(v, c) );
    }
    
    dfs(1);
    
    u = 1;
    for (i = 1; i < K; i++)
        printf("%d ", D[u][i]);
    printf("%d\n", D[u][K]);
    
    return 0;
}