Pagini recente » Cod sursa (job #2957682) | Cod sursa (job #2422888) | Cod sursa (job #3274031) | Cod sursa (job #1287607) | Cod sursa (job #1851361)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
ifstream fin ("pitici.in");
ofstream fout ("pitici.out");
int n, m, k, Post_Ord[1024], Pos[1024], Cost[1024];
vector < bool > F(1024);
vector < int > S[1024], G[1024];
vector < pair < int, int > > R[1024];
multiset < pair < int, int > > H;
void DFS(int node)
{
F[node] = true;
for (vector < int > :: iterator it = G[node].begin(); it != G[node].end(); it ++)
{
if (!F[*it]) DFS(*it);
}
Post_Ord[++Post_Ord[0]] = node;
}
int main()
{
fin >> n >> m >> k;
for (int a, b, c, i = 1; i <= m; i ++)
{
fin >> a >> b >> c;
G[a].push_back(b);
R[b].push_back( { a, c } );
}
DFS(1);
S[1].push_back(0);
for (int i = n - 1; i >= 1; i --)
{
H.clear();
for (vector < pair < int, int > > :: iterator it = R[Post_Ord[i]].begin(); it != R[Post_Ord[i]].end(); it ++)
{
Pos[it->first] = 0;
Cost[it->first] = it->second;
H.insert( { S[it->first][0] + it->second, it->first } );
}
while (S[Post_Ord[i]].size() < k && !H.empty())
{
pair < int, int > now = *H.begin();
H.erase(H.begin());
S[Post_Ord[i]].push_back(now.first);
if (++Pos[now.second] < S[now.second].size())
{
H.insert( { S[now.second][Pos[now.second]] + Cost[now.second], now.second } );
}
}
}
for (int i = 0; i < k; i ++) fout << S[n][i] << ' ';
fout << '\n';
fout.close();
return 0;
}