Cod sursa(job #34200)

Utilizator astronomyAirinei Adrian astronomy Data 20 martie 2007 13:13:42
Problema Pitici Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <set>
#include <utility>
#include <time.h>
using namespace std;

#define MAXN 1024
#define pb push_back
#define mp make_pair

int N, M, K, A[MAXN][MAXN], viz[MAXN], Ind[MAXN], cost[MAXN];
vector<int> G[MAXN];
vector<int> C[MAXN];
set< pair<int, int> > T;

void dfs(int x)
{
    int i, c, v;
    vector<int>::iterator it, it2;
    set< pair<int, int> >::iterator itset;

    for(it = G[x].begin(); it != G[x].end(); it++)
     if(!viz[*it])
        viz[*it] = 1, dfs(*it);

    T.clear();
    
    for(it = G[x].begin(), it2 = C[x].begin(); it != G[x].end(); it++, it2++)
    {
        v = *it, c = *it2, Ind[v] = 1, cost[v] = c;
        T.insert( mp(c+A[v][1], v) );
    }

    for(i = 1; i <= K && T.size(); i++)
    {
        itset = T.begin();
        v = itset->second, c = itset->first;
        A[x][++A[x][0]] = c, T.erase( mp(c, v) );
        if(Ind[v] < A[v][0])
        {
            Ind[v]++;
            T.insert( mp(cost[v]+A[v][Ind[v]], v) );
        }
    }

    if(A[x][0] == 0)
        A[x][++A[x][0]] = 0;
}

void read_and_solve(void)
{
    int i, x, y, c;

    scanf("%d %d %d\n", &N, &M, &K);

    for(i = 1; i <= M; i++)
    {
        scanf("%d %d %d\n", &x, &y, &c);
        G[y].pb(x), C[y].pb(c);
    }

    viz[N] = 1, dfs(N);

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

int main(void)
{
    freopen("pitici.in", "rt", stdin);
    freopen("pitici.out", "wt", stdout);

    int start, end;

    start = clock();
    
    read_and_solve();

    end = clock();

    fprintf(stderr, "%lf\n", (double)(end-start)/CLK_TCK);
    
    return 0;
}