Cod sursa(job #290659)

Utilizator raduzerRadu Zernoveanu raduzer Data 28 martie 2009 15:11:26
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define pii pair <int, int>
#define x first
#define y second
#define mp make_pair

const int MAX_N = 1024;

int n, m, k;
int d[MAX_N][MAX_N];
int f[MAX_N], p[MAX_N];
vector <int> sol[MAX_N];
priority_queue< pii, vector< pii > , greater< pii > > heap;

void df(int nod)
{
	int i;
	if (f[nod]) return;
	f[nod] = 1;
	
	for (i = 1; i <= n; ++i) 
		if (d[nod][i]) df(i);
	
	while (!heap.empty()) heap.pop();
	for (i = 1; i <= n; ++i)
		if (d[nod][i])	
		{
			if (sol[i].size()) 
			{
				heap.push( mp(sol[i][0] + d[nod][i], i) );
				p[i] = 1;
			}
		}
	
	for (i = 1; i <= k && !heap.empty(); ++i)
	{
		pii top = heap.top();
		heap.pop();
		sol[nod].push_back(top.x);
		
		if (p[top.y] < sol[top.y].size())
			heap.push( mp( sol[ top.y ][ p[top.y]++ ] + d[nod][top.y], top.y ) );
	}
}

int main()
{
	int i, a, b, 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", &a, &b, &c);
		
		d[b][a] = c;
	}
	
	sol[1].push_back(0);
	df(n);
	
	for (vector <int> :: iterator it = sol[n].begin(); it != sol[n].end(); ++it)
		printf("%d ", *it);
}