Cod sursa(job #46439)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 2 aprilie 2007 17:33:21
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <stdio.h>
#include <queue>
#include <vector>

using namespace std;

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define mp make_pair
#define f first
#define s second
#define nmax 1024

int n,m,k,H[nmax][nmax],A[nmax][nmax],p[nmax];
priority_queue < pair <int,int> > Q;
char viz[nmax];

void doit(int i)
{
	int x,j;
	if(viz[i])
		return ;
	viz[i]=1;
	FOR(j,0,n)
		if(A[i][j])
			doit(j);
	FOR(j,0,k)
		H[i][j]=1000111000;
	if(i==n-1)
		H[i][0]=0;
	while(!Q.empty())
		Q.pop();
	FOR(j,0,n)
		if(A[i][j])
			Q.push(mp(-H[j][0]-A[i][j],j)),p[j]=0;
	FOR(j,0,k)
	{
		if(Q.empty())
			return ;
		H[i][j]=-Q.top().f;
		x=Q.top().s;
		Q.push(mp(-H[x][++p[x]]-A[i][x],x));
		Q.pop();
	}

}

int main()
{
	int ii,i,j,c;
	freopen("pitici.in","r",stdin);
	freopen("pitici.out","w",stdout);
	scanf("%d %d %d",&n,&m,&k);
	memset(A,0,sizeof(A));
	FOR(ii,0,m)
	{
		scanf("%d %d %d",&i,&j,&c);
		i--,j--;
		A[i][j]=c;		
	}
	doit(0);
	FOR(i,0,k)
		printf("%d ",H[0][i]);
	printf("\n");
	return 0;
}