Cod sursa(job #2953427)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 11 decembrie 2022 13:09:46
Problema Pitici Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("pitici.in");
ofstream fout("pitici.out");

const int NMAX = 1019;

int n, m, k;
vector<pair<int, int>> adjr[NMAX + 1], adj[NMAX + 1];
vector<int> topoSort;
multiset<int> dist[NMAX + 1];
bool vis[NMAX + 1];

void dfs(int u = 1) {
	vis[u] = 1;
	for(const auto &edge: adj[u]) {
		if(!vis[edge.first]) {
			dfs(edge.first);
		}
	}
	topoSort.push_back(u);
}

int main() {
	ios_base :: sync_with_stdio(false);

	fin >> n >> m >> k;
	for(int i = 1; i <= m; i++) {
		int u, v, w;
		fin >> u >> v >> w;

		adj[u].push_back({v, w});
		adjr[v].push_back({u, w});
	}

	dfs();

	dist[n].insert(0);

	for(const auto &u: topoSort) {
		for(const auto &edge: adjr[u]) {
			// cout << u << " -> " << edge.first << '\n';
			for(auto it = dist[u].begin(); it != dist[u].end(); it++) {
				dist[edge.first].insert((*it) + edge.second);
				if((int) dist[edge.first].size() > k) {
					auto End = dist[edge.first].end(); End--;
					dist[edge.first].erase(End);
				}
			}
		}
	}
	
	for(auto it = dist[1].begin(); it != dist[1].end(); it++) {
		fout << (*it) << " ";
	}

	fin.close();
	fout.close();
	return 0;
}