Pagini recente » Cod sursa (job #346610) | Cod sursa (job #2560103) | Cod sursa (job #2539651) | Cod sursa (job #144227) | Cod sursa (job #3276177)
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <cassert>
#include <set>
using namespace std;
ifstream cin("pitici.in");
ofstream cout("pitici.out");
struct Info {
int16_t node2;
int16_t cost;
Info() = default;
Info(int16_t node2, int16_t cost) : node2(node2), cost(cost) {}
};
struct Info2 {
int16_t node;
int16_t dim;
int cost;
Info2() = default;
Info2(int16_t node, int16_t dim, int val) : node(node), dim(dim), cost(val) {}
bool operator<(Info2 a2) const {
if (cost == a2.cost) {
if (dim == a2.dim) {
return node < a2.node;
}
return dim < a2.dim;
}
return cost < a2.cost;
}
};
int n, m, k;
vector<vector<Info>> graph, rev_graph;
vector<vector<int>> vst;
vector<vector<int>> dist;
void read() {
cin >> n >> m >> k;
graph.resize(n + 1);
rev_graph.resize(n + 1);
for (int i = 1; i <= m; i++) {
int16_t a, b, c;
cin >> a >> b >> c;
graph[a].emplace_back(Info(b, c));
rev_graph[b].emplace_back(Info(a, c));
}
}
void solve() {
vector<int16_t> in_degree(n + 1);
for (int i = 1; i <= n; i++) {
for (auto it : graph[i]) {
in_degree[it.node2] ++;
}
}
dist.resize(n + 1, vector<int>(k + 1, 1e9));
vst.resize(n + 1);
queue<int16_t> q;
dist[1][1] = 0;
q.push(1);
int16_t tp;
while (!q.empty()) {
tp = q.front();
q.pop();
for (auto it : graph[tp]) {
in_degree[it.node2] --;
}
for (auto it : graph[tp]) {
if (in_degree[it.node2] > 0) {
continue;
}
set<Info2> st;
vector<int> additional_cost(n + 1);
for (auto it2 : rev_graph[it.node2]) {
st.insert(Info2(it2.node2, 1, dist[it2.node2][1] + it2.cost));
additional_cost[it2.node2] = it2.cost;
}
int cnt = 1;
Info2 tp2;
while (cnt <= k) {
tp2 = (*st.begin());
st.erase(st.begin());
dist[it.node2][cnt ++] = tp2.cost;
if (tp2.dim == k) {
continue;
}
st.insert(Info2(tp2.node, tp2.dim + 1, dist[tp2.node][tp2.dim + 1] + additional_cost[tp2.node]));
}
q.push(it.node2);
}
}
for (int i = 1; i <= k; i++) {
cout << dist[n][i] << " ";
}
}
int main() {
read();
solve();
return 0;
}