Pagini recente » Borderou de evaluare (job #1243129) | Borderou de evaluare (job #2180922) | Borderou de evaluare (job #958315) | Borderou de evaluare (job #2988438) | Cod sursa (job #731705)
Cod sursa(job #731705)
#include <cstdio>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int Nmax = 1030;
vector <pair <int, int> > next[Nmax], prev[Nmax];
queue <int> Q;
multiset <int> dist[Nmax];
int n, k, deg[Nmax];
void read() {
int m, x, y, c;
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= m; ++i) {
scanf("%d%d%d", &x, &y, &c);
next[x].push_back(make_pair(y, c));
prev[y].push_back(make_pair(x, c));
deg[y]++;
}
}
void solve() {
dist[1].insert(0);
Q.push(1);
while (!Q.empty()) {
int nod = Q.front(); Q.pop();
for (int i = 0; i < (int)next[nod].size(); ++i) {
--deg[next[nod][i].first];
if (!deg[next[nod][i].first])
Q.push(next[nod][i].first);
}
for (int i = 0; i < (int)prev[nod].size(); ++i)
for (set <int>::iterator it = dist[prev[nod][i].first].begin(); it != dist[prev[nod][i].first].end(); ++it) {
dist[nod].insert(*it + prev[nod][i].second);
if ((int)dist[nod].size() > k)
dist[nod].erase(--dist[nod].end());
}
}
}
void print() {
for (set <int>::iterator it = dist[n].begin(); it != dist[n].end(); ++it)
printf("%d ", *it);
}
int main() {
freopen("pitici.in", "r", stdin);
freopen("pitici.out", "w", stdout);
read();
solve();
print();
return 0;
}