Cod sursa(job #374344)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 16 decembrie 2009 19:34:05
Problema Pitici Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <set>
#include <queue>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define N 1<<10
#define inf 1000000000
using namespace std;
int n,m,k;
vector <pair <int,int> > A[N];
int cost[N][N],pre[N],nrst[N];
char viz[N];
priority_queue <pair <int, int> > T;
void read()
{
	scanf("%d%d%d",&n,&m,&k);
	int i,x,y,z;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		A[x].pb(mp(y,z));
	}
}
void init()
{
	int i,j;
	for (i=1; i<=n; i++)
		for (j=1; j<=k; j++)
			cost[i][j]=inf;
	cost[n][1]=0;
}
void dfs(int nod)
{
	if (viz[nod])
		return ;
	viz[nod]=1;
	int i,st,val,x;
	for (i=0; i<A[nod].size(); i++)
		dfs(A[nod][i].f);
	while (!T.empty())
		T.pop();
	for (i=0; i<A[nod].size(); i++)
	{
		st=A[nod][i].f;
		pre[st]=1;
		nrst[st]=A[nod][i].s;
		T.push(mp(cost[st][1]+A[nod][i].s,st));
	}
	int r=0;
	for (i=1; i<=k && !T.empty(); i++)
	{
		val=T.top().f, x =T.top().s;
		T.pop();
		if (val>=inf)
			break;
		cost[nod][++r]=val;
		++pre[x];
		if (pre[x]<=k)
			T.push(mp(nrst[x]+cost[x][pre[x]],x));
	}
}
void show()
{
	int i;
	for (i=1; i<=k; i++)
		printf("%d ",cost[1][i]);
	printf("\n");
}
int main()
{
	freopen("pitici.in","r",stdin);
	freopen("pitici.out","w",stdout);
	read();
	init();
	dfs(1);
	show();
	return 0;
}