Cod sursa(job #1416246)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 7 aprilie 2015 18:13:33
Problema Pitici Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

#define inFile "pitici.in"
#define outFile "pitici.out"
#define MAX_N 1020
#define MAX_M 200020

struct edge {
    int other;
    int cost;
};
vector < edge > adjNext[MAX_N];
vector < edge > adjPrev[MAX_N];
int D[MAX_N][MAX_N];
int K;

int getWays(int Node, int Length) {
    if(D[Node][Length] != -1) return D[Node][Length];

    int i;
    D[Node][Length] = 0;
    for(i = 0; i < adjPrev[Node].size(); i++) {
        D[Node][Length] += getWays(adjPrev[Node][i].other, Length - adjPrev[Node][i].cost);
        if(D[Node][Length] > K) D[Node][Length] = K;
    }

    return D[Node][Length];
}

int main() {
    FILE *in = fopen(inFile, "r");
    FILE *out = fopen(outFile, "w");

    int N, M, i, j, a, b, c;

    memset(D, -1, sizeof(D[0][0]) * MAX_N * MAX_N);

    fscanf(in, "%d %d %d", &N, &M, &K);
    for(i = 1; i <= M; i++) {
        fscanf(in, "%d %d %d", &a, &b, &c);
        adjNext[a].push_back( {b,c} );
        adjPrev[b].push_back( {a,c} );
    }

    for(i = 1; i <= N; i++) D[i][0] = 1;
    for(i = 1; i <= N; i++) {
        for(j = 1; j <= N; j++) {
            D[i][j] = getWays(i,j);
        }
    }

    for(i = 1; D[N][i] == -1; i++);
    while(K) {
        for(j = 1; j <= min(D[N][i], K); j++)
            fprintf(out, "%d\n", i);
        K -= D[N][i];
        i++;
    }

    return 0;
}