Cod sursa(job #283916)

Utilizator tvladTataranu Vlad tvlad Data 20 martie 2009 18:50:00
Problema Pitici Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;

const int N_MAX = 1024;

int n,m,pitici;
vector< pair<int,int> > G[N_MAX];
multiset<int> S[N_MAX];
vector<int> vaux;

void df ( int k ) {
	if (S[k].size()) return;
	if (k == n-1) {
		S[k].insert(0);
		return;
	}
	for (vector< pair<int,int> >::iterator it = G[k].begin(); it != G[k].end(); ++it) {
		df(it->first);
		for (multiset<int>::iterator j = S[it->first].begin(); j != S[it->first].end(); ++j)
			S[k].insert(*j + it->second);
	}
	if (S[k].size() > pitici) {
		multiset<int>::iterator wh = S[k].begin();
		for (int i = 0; i < pitici; ++i, ++wh);
		S[k].erase(wh,S[k].end());
	}
}

int main() {
	freopen("pitici.in","rt",stdin);
	freopen("pitici.out","wt",stdout);
	scanf("%d %d %d",&n,&m,&pitici);
	for (int i = 0, a,b,c; i < m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		--a; --b;
		G[a].push_back(make_pair(b,c));
	}
	df(0);
	multiset<int>::iterator it = S[0].begin();
	for (int i = 0; i < pitici; ++i, ++it)
		printf("%d ",*it);
	printf("\n");
	return 0;
}