Pagini recente » Cod sursa (job #1691799) | Cod sursa (job #2483863) | Cod sursa (job #102664) | Cod sursa (job #52491) | Cod sursa (job #961098)
Cod sursa(job #961098)
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define sz(c) int((c).size())
#define pb push_back
#define ii pair<int, int>
#define mp make_pair
#define x first
#define y second
#define Nmax 1024
int n, k;
vector< pair<int, int> > G[Nmax], G2[Nmax];
char viz[Nmax];
int v[Nmax], cnt;
vector<int> list[Nmax];
priority_queue< ii, vector<ii>, greater<ii> > H;
int dist[Nmax], ind[Nmax];
void readdata()
{
freopen("pitici.in", "r", stdin);
freopen("pitici.out", "w", stdout);
int i, a, b, c, m;
scanf("%d %d %d", &n, &m, &k);
for (i = 1; i <= m; ++i)
{
scanf("%d %d %d", &a, &b, &c);
G[a].pb( mp(b, c) );
G2[b].pb( mp(a, c) );
}
}
void df(int k)
{
int i, nod;
viz[k] = 1;
for (i = 0; i < sz(G[k]); ++i)
{
nod = G[k][i].x;
if (!viz[nod]) df(nod);
}
v[++cnt] = k;
}
void solve()
{
int i, j, nod, nod2;
ii p;
df(1);
list[1].pb(0);
for (i = cnt-1; i; --i)
{
nod = v[i];
while (!H.empty()) H.pop();
for (j = 0; j < sz(G2[nod]); ++j)
{
nod2 = G2[nod][j].x;
dist[nod2] = G2[nod][j].y;
ind[nod2] = 1;
H.push( mp(list[nod2][0] + dist[nod2], nod2) );
}
for (j = 1; j <= k && !H.empty(); ++j)
{
p = H.top();
H.pop();
list[nod].pb(p.x);
if (ind[p.y] < sz(list[p.y]))
H.push( mp(list[p.y][ind[p.y]++] + dist[p.y] , p.y) );
}
}
}
void writedata()
{
int i;
for (i = 0; i < k; ++i)
printf("%d ", list[n][i]);
}
int main()
{
readdata();
solve();
writedata();
return 0;
}