Cod sursa(job #161413)

Utilizator damaDamaschin Mihai dama Data 17 martie 2008 23:37:39
Problema Pitici Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
/*
ID: damamih1
PROB: cowjog
LANG: C++
*/

#include <stdio.h>
#include <vector>
#include <algorithm>

const int inf = 2000000000;

using namespace std;

int h[1024][128], n, m, k, temp[210];
vector<int> v[1024], cost[1024];

int bs(int);

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

	int i, j, a, b, c, cnt, pos, l;

	scanf("%d %d %d", &n, &m, &k);

	for(i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &a, &b, &c);
		v[a].push_back(b);
		cost[a].push_back(c);
	}

	for(i = 1; i <= n; ++i)
	{
		for(j = 0; j <= k; ++j)
		{
			h[i][j] = inf;
		}
	}

	h[n][1] = 0;

	for(i = n; i > 1; --i)
	{
		int sz = v[i].size();
		for(j = 0; j < sz; ++j)
		{
			cnt = 1;
			for(l = 1; l <= k; ++l)
			{
				temp[l] = h[v[i][j]][l];
			}

			temp[0] = k;
			pos = bs(h[i][cnt] + cost[i][j]);
			while(pos <= k && cnt <= k)
			{
				temp[++temp[0]] = h[i][cnt] + cost[i][j];
				++cnt;
				pos = bs(h[i][cnt] + cost[i][j]);
			}

			sort(temp + 1, temp + temp[0] + 1);
			for(l = 1; l <= k; ++l)
			{
				h[v[i][j]][l] = temp[l];
			}
		}
	}

	for(i = 1; i <= k; ++i)
	{
		if(h[1][i] != inf)
		{
			printf("%d ", h[1][i]);
		}
		else
		{
			printf("-1\n");
		}
	}
	printf("\n");


	return 0;
}

int bs(int val)
{
	int min = 1, mid, max = k, ret = k + 1;

	while(min <= max)
	{
		mid = (min + max) / 2;
		if(temp[mid] > val)
		{
			max = mid - 1;
			ret = mid;
		}
		else
		{
			min = mid + 1;
		}
	}
	return ret;
}