Cod sursa(job #283930)

Utilizator CezarMocanCezar Mocan CezarMocan Data 20 martie 2009 19:28:05
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <vector>
#include <set>
#define maxn 1050
#define inf 2000000000

using namespace std;

int n, m, i, j, k, a, b, c;
vector <int> v[maxn], cs[maxn];
int cd[maxn], nrin[maxn], nr[maxn];

multiset <int> h[maxn];
multiset <int>::iterator it;

int nrt[maxn];

void insert(int nod, int cost) {
	multiset <int>::iterator it2;
	int ct = 0;

	if (h[nod].size()) {
		it2 = h[nod].end();
		--it2;
		ct = (*it2);
	}

//	fprintf(stderr, "%d %d %d\n", nod, cost, nrt[nod]);

	if (nrt[nod] == k && cost >= ct)
		return;
//	fprintf(stderr, "%d %d\n", nod, nrt[nod]);
	//tre sa il bag 
	if (nrt[nod] < k) {
		h[nod].insert(cost);
		nrt[nod]++;
	}
	else {
//		fprintf(stderr, "%d %d\n", nod, *it);
		h[nod].erase(ct);
		h[nod].insert(cost);
	}

}

void bf(int nd) {
	int nod, fiu, i, j, p, u;
	p = u = 1;
	cd[1] = nd;
	h[1].insert(0);

	while (p <= u) {
		nod = cd[p];
		for (i = 0; i < v[nod].size(); i++) {
			fiu = v[nod][i];
			nr[fiu]++; //in asta tin cat intra in el

//			fprintf(stderr, "%d %d\n", nod, fiu);

			for (it = h[nod].begin(); it != h[nod].end(); ++it) {//drumurile de pana acum 
				insert(fiu, (*it) + cs[nod][i]);
//				fprintf(stderr, "%d %d %d\n", nod, fiu, (*it) + cs[nod][i]);
			}

			if (nr[fiu] == nrin[fiu]) {
				u++;
				cd[u] = fiu;
			}
		}
		p++;
	}
}

int main() {
	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);
		nrin[b]++;
		v[a].push_back(b);
		cs[a].push_back(c);
	}

	bf(1);

	it = h[n].begin();

	for (i = 1; i <= k; i++) {
		printf("%d ", *it);
		++it;
	}

	return 0;
}