Cod sursa(job #2527741)

Utilizator sichetpaulSichet Paul sichetpaul Data 20 ianuarie 2020 20:39:39
Problema Pitici Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
#define Nmax 1020
#define INF Nmax * Nmax
#define pi pair<int, int>
#define pb push_back
using namespace std;

ifstream f("pitici.in");
ofstream g("pitici.out");

int N, M, K, len;
vector<pi> G[Nmax], GT[Nmax];
vector<int> road[Nmax];
int aux[INF], a[Nmax];
bool vis[Nmax];

struct Node{
   int pos, lev;
};
Node v[Nmax];
bool cmp(Node a, Node b) {
   return a.lev < b.lev;
}

void DFS(int node, int father) {
    vis[node] = 1;
    v[node].lev = v[father].lev + 1;
    for (auto it: G[node])
        if (!vis[it.first]) DFS(it.first, node);
}
void compute(int x) {
    len = 0;
    for (auto it: GT[x])
    for (auto it2: road[it.first])
       aux[++len] = it2 + it.second;
    sort(aux + 1, aux + len + 1);
}
int main()
{
    f >> N >> M >> K;
    for (int i = 1; i <= M; ++i) {
        int x, y, c;
        f >> x >> y >> c;
        G[x].pb({y, c});
        GT[y].pb({x, c});
    }
    for (int i = 1; i <= N; ++i)
        v[i].pos = i;
    DFS(1, 0);
    sort(v + 1, v + N + 1, cmp);

    for (int i = 1; i <= N; ++i)
        a[i] = v[i].pos;

    road[1].pb(0);
    for (int i = 2; i <= N; ++i) {
        compute(a[i]);
        for (int j = 1; j <= min(len, K); ++j)
            road[a[i]].pb(aux[j]);
    }

    for (auto it: road[N])
        g << it << " ";
    return 0;
}