Cod sursa(job #161455)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 18 martie 2008 10:43:38
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
/*
ID: bogdan1
TASK: cowjog
LANG: C++
*/

#include <cstdio>
#include <vector>
#include <set>

using namespace std;

#define MAXN 1024
int N, M, K;
vector< pair<int, int> > con[MAXN], coni[MAXN];

multiset< pair<int, int> > S;
int dN[MAXN];

void insertNew( int nod, int val )
{
	if ((int)S.size() < K)
	{
		S.insert( make_pair(val, nod) );
		return;
	}

	set< pair<int, int> > :: iterator it;
	it = S.end(); --it;

	if (val < (*it).first)
	{
		S.erase(it);
		S.insert( make_pair(val, nod) );
	}
}

int main()
{
	freopen("pitici.in", "rt", stdin);
	freopen("pitici.out", "wt", stdout);

	scanf("%d %d %d", &N, &M, &K);
	for (int i = 0; i < M; i++)
	{
		int x, y, cst;
		scanf("%d %d %d", &x, &y, &cst);

		con[x].push_back( make_pair(y, cst) );
		coni[y].push_back( make_pair(x, cst) );
	}

	memset( dN, 0x3f, sizeof(dN) );
	dN[N] = 0; S.insert( make_pair(0, N) );

	for (; !S.empty(); )
	{
		int i = S.begin() -> second;

		S.erase( S.begin() );

		vector< pair<int, int> > :: iterator it;
		for (it = coni[i].begin(); it != coni[i].end(); it++)
			if (dN[i] + (*it).second < dN[ (*it).first ])
			{
				S.erase( make_pair( dN[ (*it).first ], (*it).first ) );
				dN[ (*it).first ] = dN[i] + (*it).second;
				S.insert( make_pair( dN[ (*it).first ], (*it).first ) );
			}
	}

	S.clear();
	S.insert( make_pair( dN[1], 1 ) );
	for (; !S.empty() && K; )
	{
		set< pair<int, int> > :: iterator sit;
		/*for (sit = S.begin(); sit != S.end(); sit++)
		{
			int i = sit -> second, cst = sit -> first - dN[i];
			printf("%d %d + %d -> %d\n", i, cst, dN[i], cst + dN[i]);
		}
		printf("\n\n");*/

		int i = S.begin() -> second, cst = S.begin() -> first - dN[i];

		S.erase( S.begin() );

		if (i == N)
		{
			printf("%d ", cst); K--;
			continue;
		}
		vector< pair<int, int> > :: iterator it;
		for (it = con[i].begin(); it != con[i].end(); it++)
			insertNew( (*it).first, cst + (*it).second + dN[ (*it).first ] );
	}
	for (; K; K--)
		printf("-1\n");

	return 0;
}