Pagini recente » Cod sursa (job #2455316) | Cod sursa (job #203510) | Cod sursa (job #416139) | Cod sursa (job #231073) | Cod sursa (job #34404)
Cod sursa(job #34404)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define INF 1000000001
#define id first
#define cost second
#define NMax 1025
using namespace std;
typedef pair<int, int> pereche;
int N, K, uz[NMax];
vector< pereche > G[NMax];
int D[NMax][NMax], f[NMax], C[NMax];
priority_queue < pereche > H;
bool operator< (const pereche& a, const pereche& b)
{
if (a.second != b.second) return (a.second > b.second);
return (a.first < b.first);
}
void dfs(int nod)
{
int i, nr, p, x;
vector< pair<int, int> >::iterator it;
for (i = 1; i <= K+1; i++)
D[nod][i] = INF;
if (G[nod].size() == 0)
{ D[nod][1] = (nod != N)*INF; return ; }
uz[nod] = 1;
for (it = G[nod].begin(); it != G[nod].end(); it++)
if (!uz[it->id])
dfs(it->id);
while (!H.empty()) H.pop();
memset(f, 0, sizeof(f));
memset(C, 0, sizeof(C));
for (it = G[nod].begin(), nr = 1; it != G[nod].end(); it++, nr++)
{
H.push( make_pair( - D[it->id][1] - it->cost, it->id) );
f[it->id] = 1; C[it->id] = it->cost;
}
p = 0;
while (p < K)
{
x = (H.top()).first; nr = (H.top()).second;
if (x <= -INF) return ;
D[nod][++p] = - x;
H.pop();
H.push( make_pair(- D[nr][++f[nr]] - C[nr], nr) );
}
}
int main(void)
{
int M, i, u, v, c;
freopen("pitici.in", "r", stdin);
freopen("pitici.out", "w", stdout);
scanf("%d %d %d", &N, &M, &K);
for (; M; M--)
{
scanf("%d %d %d", &u, &v, &c);
G[u].push_back( make_pair(v, c) );
}
dfs(1);
u = 1;
for (i = 1; i < K; i++)
printf("%d ", D[u][i]);
printf("%d\n", D[u][K]);
return 0;
}