Cod sursa(job #3145079)

Utilizator NanuGrancea Alexandru Nanu Data 12 august 2023 16:03:02
Problema Pitici Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

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

#define DIM 1020
#define INF 0x3f3f3f3f
typedef pair<int, pair<int, int>> PIII;

int n, m, k;
bool viz[DIM + 5];
int dp[DIM + 5][DIM + 5];
vector <int> a;
vector <pair<int, int>> G[DIM + 5];

static inline void dfs(int nod) {
  viz[nod] = 1;
  for(auto e : G[nod])
    if(!viz[e.first])
      dfs(e.first);

  a.push_back(nod);
}

int main() {
  fin >> n >> m >> k;
  for(int i = 1, x, y, z; i <= m; i++) {
    fin >> x >> y >> z;
    G[x].push_back({y, z});
  }

  dfs(1);

  //dp[i][j] = al j-ulea cel mai bun drum pana la nodul i(in sens invers, de la n la 1)
  for(int i = 1; i <= n; i++)
    for(int j = 1; j <= k; j++)
      dp[i][j] = INF;

  dp[n][1] = 0; // pornim de la n la 1;
  for(auto e : a) {
    priority_queue <PIII, vector<PIII>, greater<PIII>> PQ;
    
    for(auto it : G[e])
      PQ.push({dp[it.first][1] + it.second, {it.first, 1}});
    
    if(PQ.empty())
      continue;

    for(int i = 1; i <= k; i++) {
      int dist = PQ.top().first;
      int nod = PQ.top().second.first;
      int id = PQ.top().second.second;
      PQ.pop();

      dp[e][i] = dist;    //cea mai buna distanta;
      if(id < k) {
        dist = dist - dp[nod][id] + dp[nod][id + 1];  //scad distanta de la pasul id si o adun pe cea noua.
        PQ.push({dist, {nod, id + 1}});
      }
    }
  }

  for(int i = 1; i <= k; i++)
    fout << dp[1][i] << " ";

  return 0;
}