Cod sursa(job #176397)

Utilizator plastikDan George Filimon plastik Data 11 aprilie 2008 10:39:47
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
// Pitici, Infoarena/Lot 2006
// http://infoarena.ro/problema/pitici

#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <cstring>
#include <set>
#include <list>
#include <queue>
using namespace std;

const int NMAX = 1024;
const int MMAX = 200128;

int n, m, k;
multiset<int> Costs[NMAX];
list<pair<int, int> > Neighb[NMAX];
bool Used[NMAX];

list<pair<int, int> >::iterator it;
multiset<int>::iterator msi, aux;

void breadthFirst() {
	memset(Used, 0, sizeof(Used));
	Costs[1].insert(0);
	
	int curr, next, cost;
	queue<int> Q;
	for (Q.push(1); Q.empty() == false; Q.pop()) {
		curr = Q.front();
		for (it = Neighb[curr].begin(); it != Neighb[curr].end(); ++ it) {
			next = it->first;
			cost = it->second;
		
			for (msi = Costs[curr].begin(); msi != Costs[curr].end(); ++ msi) {
				Costs[next].insert(*msi + cost);
				if (Costs[next].size() > k) {
					aux = Costs[next].end();
					-- aux;
					Costs[next].erase(aux);
				}
			}

			if (Used[next] == true)
				continue;

			Q.push(next);
			Used[next] = true;
		}
	}
}

int main() {

	freopen("pitici.in", "r", stdin);
	freopen("pitici.out", "w", stdout);

	scanf("%d %d %d", &n, &m, &k);
	int i, v1, v2, c;
	for (i = 0; i < m; ++ i) {
		scanf("%d %d %d", &v1, &v2, &c);
		Neighb[v1].push_back(make_pair(v2, c));
	}

	breadthFirst();
	for (msi = Costs[n].begin(); msi != Costs[n].end(); ++ msi)
		printf("%d ", *msi);

	return 0;
}