Pagini recente » Cod sursa (job #2798044) | Cod sursa (job #2180200) | Cod sursa (job #2604998) | Cod sursa (job #868090) | Cod sursa (job #3145079)
#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;
}