Pagini recente » Cod sursa (job #2262718) | Cod sursa (job #678265) | Cod sursa (job #2238880) | Cod sursa (job #693239) | Cod sursa (job #332990)
Cod sursa(job #332990)
/*
TASK: cowjog
LANG: C++
ID: mystupidn1
*/
#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
#define NMAX 1030
#define MP make_pair
#define ff first
#define ss second
#define MAX 10000
int N, M, K;
vector <pair<int, int> > leg[NMAX];
int nr[NMAX];
int grad[NMAX];
int coada[NMAX];
int din[NMAX];
multiset <pair<int, int> > H;
int main()
{
int i, x, y, c;
freopen("pitici.in", "r", stdin);
freopen("pitici.out", "w", stdout);
scanf("%d %d %d", &N, &M, &K);
for (i = 1; i <= M; i++) {
scanf("%d %d %d", &x, &y, &c);
leg[x].push_back(MP(y, c));
grad[y]++;
}
int p = 1, q = 1;
coada[1] = 1;
vector <pair<int, int> > :: iterator itv;
while (p <= q) {
x = coada[p++];
for (itv = leg[x].begin(); itv != leg[x].end(); ++itv) {
y = itv->ff;
grad[y]--;
if (grad[y] == 0) coada[++q] = y;
}
}
din[N] = 0;
for (i = N; i >= 1; i--) {
x = coada[i];
for (itv = leg[x].begin(); itv != leg[x].end(); ++itv)
din[x] = min(din[x], din[itv->ff] + itv->ss);
}
H.insert(MP(din[1], 1));
q = 0;
while (q < K) {
x = H.begin()->ss;
c = H.begin()->ff;
H.erase(H.begin());
int dst = c - din[x];
if (x == N) {
printf("%d ", c);
q++;
continue;
}
for (itv = leg[x].begin(); itv != leg[x].end(); ++itv) {
H.insert(MP(dst + itv->ss + din[itv->ff], itv->ff));
while ((int) H.size() > K) H.erase(--H.end());
}
}
printf("\n");
return 0;
}