Cod sursa(job #161933)

Utilizator alextheroTandrau Alexandru alexthero Data 18 martie 2008 23:41:18
Problema Pitici Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <stdio.h>
#include <vector>
#include <set>

#define nmax 1024
#define pb push_back

using namespace std;
typedef pair<int, int> ii;

int l, n, m, k, n1, n2, cs, vec, cost;
char v[nmax];
vector <int> ord;
vector <ii> e[nmax];
multiset <int> s[nmax];
multiset <int> :: iterator it;

void dfs(int x)
{
	v[x] = 1;
	for(int i = 0; i < (int)e[x].size(); i++)
		if(!v[e[x][i].first]) dfs(e[x][i].first);
	ord.pb(x);
}

int main()
{
	freopen("pitici.in", "r", stdin);
	freopen("pitici.out", "w", stdout);
	
	scanf("%d%d%d", &n, &m, &k);
	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d%d", &n1, &n2, &cs);
		e[n1].pb(ii(n2, cs));
	}

	dfs(1);
	s[1].insert(0);
	for(int i = ord.size() - 1; i >= 0; i--)
		for(int j = 0; j < (int)e[ord[i]].size(); j++)
		{
			vec = e[ord[i]][j].first, cost = e[ord[i]][j].second;
			for(it = s[ord[i]].begin(), l = 1; it != s[ord[i]].end() && l <= k; ++it, ++l)
				s[vec].insert(*it + cost);
		}

	for(it = s[n].begin(), l = 1; it != s[n].end() && l <= k; ++it, ++l) printf("%d ", *it); printf("\n");
	return 0;
}