Pagini recente » Cod sursa (job #740706) | Cod sursa (job #444288) | Cod sursa (job #1513457) | Cod sursa (job #51706) | Cod sursa (job #1838920)
#include <cstdio>
#include <queue>
#include <vector>
#define MAXN 1050
using namespace std;
int n, m, k;
struct vecin
{
int y, cost;
vecin(int y = 0, int cost = 0) : y(y), cost(cost) { }
};
vector<vecin> graf[MAXN];
int viz[MAXN], fin[MAXN];
void read()
{
scanf("%d %d %d", &n, &m, &k);
for (int i = 1; i <= m; i++) {
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
graf[x].push_back(vecin(y, z));
}
}
vector<int> succ[MAXN];
struct elem
{
int od, ind, cost;
elem(int od = 0, int ind = 0, int cost = 0) : od(od), ind(ind), cost(cost) { }
int getMass()
{
return succ[od][ind] + cost;
}
bool operator()(elem e, elem f)
{
return e.getMass() > f.getMass();
}
};
priority_queue<elem, vector<elem>, elem> heap;
void solve(int nod)
{
viz[nod] = 1;
if (nod == n) {
fin[nod] = 1;
succ[nod].push_back(0);
}
for (vecin v : graf[nod]) {
if (viz[v.y]) continue;
solve(v.y);
}
while (!heap.empty()) heap.pop();
for (vecin v : graf[nod]) {
if (fin[v.y]) {
fin[nod] = 1;
heap.push(elem(v.y, 0, v.cost));
}
}
for (int i = 1; i <= k && !heap.empty(); i++) {
elem t = heap.top();
heap.pop();
succ[nod].push_back(t.getMass());
if (t.ind < succ[t.od].size()-1)
heap.push(elem(t.od, t.ind+1, t.cost));
}
}
void afisare()
{
if (succ[1].size() != k)
fprintf(stderr, "ERROR");
for (int i = 0; i < k; i++) {
printf("%d ", succ[1][i]);
}
}
int main()
{
freopen("pitici.in", "r", stdin);
freopen("pitici.out", "w", stdout);
read();
solve(1);
afisare();
}