Pagini recente » Cod sursa (job #2758191) | Cod sursa (job #2317013) | Cod sursa (job #2650039) | Cod sursa (job #2324916) | Cod sursa (job #290659)
Cod sursa(job #290659)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define pii pair <int, int>
#define x first
#define y second
#define mp make_pair
const int MAX_N = 1024;
int n, m, k;
int d[MAX_N][MAX_N];
int f[MAX_N], p[MAX_N];
vector <int> sol[MAX_N];
priority_queue< pii, vector< pii > , greater< pii > > heap;
void df(int nod)
{
int i;
if (f[nod]) return;
f[nod] = 1;
for (i = 1; i <= n; ++i)
if (d[nod][i]) df(i);
while (!heap.empty()) heap.pop();
for (i = 1; i <= n; ++i)
if (d[nod][i])
{
if (sol[i].size())
{
heap.push( mp(sol[i][0] + d[nod][i], i) );
p[i] = 1;
}
}
for (i = 1; i <= k && !heap.empty(); ++i)
{
pii top = heap.top();
heap.pop();
sol[nod].push_back(top.x);
if (p[top.y] < sol[top.y].size())
heap.push( mp( sol[ top.y ][ p[top.y]++ ] + d[nod][top.y], top.y ) );
}
}
int main()
{
int i, a, b, 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", &a, &b, &c);
d[b][a] = c;
}
sol[1].push_back(0);
df(n);
for (vector <int> :: iterator it = sol[n].begin(); it != sol[n].end(); ++it)
printf("%d ", *it);
}