Cod sursa(job #612819)

Utilizator SpiderManSimoiu Robert SpiderMan Data 10 septembrie 2011 14:00:00
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
# include <cstdio>
# include <queue>
# include <vector>
using namespace std;

typedef pair <int, int> PR;
const char *FIN = "pitici.in", *FOU = "pitici.out";
const int MAX = 1020;

# define x first
# define y second

bool viz[MAX];
unsigned poz[MAX];
int N, M, K, sum[MAX];
vector <int> L[MAX];
vector <PR> G[MAX];

void dfs (int nod) {
    viz[nod] = 1;
    for (typeof (G[0].begin ()) it = G[nod].begin (); it != G[nod].end (); ++it) {
        if (viz[it -> x]) continue;
        dfs (it -> x);
    }
    priority_queue <PR, vector <PR>, greater <PR> > Q;
    for (typeof (G[0].begin ()) it = G[nod].begin (); it != G[nod].end (); ++it) {
        poz[it -> x] = 0, sum[it -> x] = it -> y;
        if (L[it -> x].empty ()) continue;
        Q.push (make_pair (L[it -> x][0] + it -> y, it -> x));
    }
    L[nod].reserve (K);
    for (int i = 0; i < K && Q.size (); ++i) {
        int X = Q.top ().y;
        L[nod].push_back (Q.top ().x), Q.pop ();
        if (++poz[X] < L[X].size ())
            Q.push (make_pair (L[X][poz[X]] + sum[X], X));
    }
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d %d", &N, &M, &K);
    for (int i = 1, x, y, z; i <= M; ++i) {
        scanf ("%d %d %d", &x, &y, &z);
        G[x].push_back (make_pair (y, z));
    }
    L[N].push_back (0), dfs (1);
    for (vector <int> :: iterator i = L[1].begin (); i != L[1].begin () + K; ++i)
        printf ("%d ", *i);
}