Cod sursa(job #73378)

Utilizator wefgefAndrei Grigorean wefgef Data 18 iulie 2007 11:22:58
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#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;
}