Cod sursa(job #332992)

Utilizator gcosminGheorghe Cosmin gcosmin Data 21 iulie 2009 10:31:44
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
/*
TASK: cowjog
LANG: C++
ID: mystupidn1
*/

#include <stdio.h>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

#define NMAX 1030
#define MP make_pair
#define ff first
#define ss second

#define INF 1000000000

int N, M, K;

vector <pair<int, int> > leg[NMAX];

int nr[NMAX];

int grad[NMAX];
int coada[NMAX];

int din[NMAX];

multiset <pair<int, int> > H;

int main()
{
	int i, x, y, 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", &x, &y, &c);

		leg[x].push_back(MP(y, c));

		grad[y]++;
	}

	int p = 1, q = 1;
	coada[1] = 1;

	vector <pair<int, int> > :: iterator itv;

	while (p <= q) {
		x = coada[p++];

		for (itv = leg[x].begin(); itv != leg[x].end(); ++itv) {
			y = itv->ff;
			grad[y]--;
			if (grad[y] == 0) coada[++q] = y;
		}
	}

	din[N] = 0;

	for (i = N; i >= 1; i--) {
		x = coada[i];
		if (x != N) din[x] = INF;
		for (itv = leg[x].begin(); itv != leg[x].end(); ++itv)
			din[x] = min(din[x], din[itv->ff] + itv->ss);
	}

	H.insert(MP(din[1], 1));

	q = 0;
	while (q < K) {
		x = H.begin()->ss;
		c = H.begin()->ff;

		H.erase(H.begin());

		int dst = c - din[x];
		
		if (x == N) {
			printf("%d ", c);
			q++;
			continue;
		}

		for (itv = leg[x].begin(); itv != leg[x].end(); ++itv) {
			H.insert(MP(dst + itv->ss + din[itv->ff], itv->ff));

			while ((int) H.size() > K) H.erase(--H.end());
		}
	}

	printf("\n");

return 0;
}