Cod sursa(job #1848933)

Utilizator tudormaximTudor Maxim tudormaxim Data 16 ianuarie 2017 20:56:12
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

ifstream fin ("pitici.in");
ofstream fout ("pitici.out");

const int maxn = 1025;
const int oo = 1 << 29;
int n, m, k, v[maxn], Dp[maxn][maxn], Nr[maxn][maxn];
vector <pair <int,int> > G[maxn];
vector <int> L[maxn];

void Dfs(int node, int step) {
    if (node == 1) {
        if (step == 1) {
            Dp[node][step] = 0;
            Nr[node][step] = 1;
        } else {
            Dp[node][step] = oo;
            Nr[node][step] = 0;
        }
        return;
    }
    int i, ways = 0, minn = oo;
    for (i = 0; i < L[node].size(); i++) {
        if (L[node][i] == 0 || (Dp[G[node][i].first][L[node][i]] + G[node][i].second == Dp[node][step - 1])) {
           L[node][i]++;
            if (Dp[G[node][i].first][L[node][i]] == 0)
                Dfs(G[node][i].first, L[node][i]);
        }
    }
    for (i = 0; i < G[node].size(); i++) {
        if(Dp[G[node][i].first][L[node][i]] + G[node][i].second < minn) {
            ways = Nr[G[node][i].first][L[node][i]];
            minn = Dp[G[node][i].first][L[node][i]] + G[node][i].second;
        } else if(Dp[G[node][i].first][L[node][i]] + G[node][i].second == minn) {
            ways += Nr[G[node][i].first][L[node][i]];
        }

    }
    Dp[node][step] = minn;
    Nr[node][step] = ways;
}

int main() {
    ios_base :: sync_with_stdio (false);
    int x, y, c, i, step = 0;
    fin >> n >> m >> k;
    while (m--) {
        fin >> x >> y >> c;
        L[y].push_back(0);
        G[y].push_back(make_pair(x, c));
    }
    while (k) {
        Dfs(n, ++step);
        for (i = 1; i <= Nr[n][step] && k; i++) {
            k--;
            fout << Dp[n][step] << " ";
        }
    }
    fin.close();
    fout.close();
    return 0;
}