Cod sursa(job #199531)

Utilizator devilkindSavin Tiberiu devilkind Data 19 iulie 2008 12:07:45
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define NMAX 1020
#define pb push_back
#define sz size()
#define mp make_pair
#define ff first
#define ss second

vector< pair<int,int> > G[NMAX];
pair<int,int> hp[2*NMAX];
int n,m,k,dimh;
int gr[NMAX];
int cnt[NMAX],cst[NMAX];
vector<int> D[NMAX];

void baga( pair<int,int> x )
{
	pair<int,int> aux;

	hp[++dimh]=x;
	for (int i=dimh; (i>1) && (hp[i]<hp[i/2]) ;i/=2)
			 swap( hp[i/2], hp[i] );
}

void recheap(int nod)
{
	int p=nod;

	if ( (nod*2<dimh)&&(hp[nod*2]<hp[p]) ) p=nod*2;
	if ( (nod*2+1<dimh)&&(hp[nod*2+1]<hp[p]) ) p=nod*2+1;

	if (p!=nod)
	{
		swap( hp[p], hp[nod]);
		recheap(p);
	}
}

void extract()
{
	hp[1]=hp[dimh];
	dimh--;
	if (dimh) recheap(1);
}

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

	int x,y,z,nod;

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

	for (int i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&z);
		G[x].pb( mp(y,z) );
		gr[y]++;
	}


	int cd[NMAX];

	cd[0]=0;
	for (int i=1;i<=n;i++)
		if (gr[i]==0) cd[ ++cd[0] ] = i;
	

	for (int i=1;i<=cd[0];i++)
		{
			nod=cd[i];
		//	printf("%d ",nod);
			for (int j=0;j<(int)G[nod].sz;j++)
				{
					gr[ G[nod][j].ff ]--;
					if (gr[ G[nod][j].ff ] == 0) cd[ ++cd[0] ] = G[nod][j].ff;
				}
		}


//	printf("\n");
	D[n].pb(0);

	for (int i=n-1;i;i--)
	{
		nod=cd[i];
		dimh=0;
		for (int j=0;j<(int)G[nod].sz;j++)
		{
			if (D[ G[nod][j].ff ].sz) baga( mp(D[ G[nod][j].ff ][0]+G[nod][j].ss, G[nod][j].ff) );
			cst[ G[nod][j].ff ] = G[nod][j].ss;
		}
		
		memset(cnt,0,sizeof(cnt));
//		printf("%d %d\n",nod,dimh);

		for (int j=1;j<=k;j++)
		{
			if (dimh==0) break;
			
			D[nod].pb( hp[1].ff );
			
			x=hp[1].ss;
			extract();

			cnt[x]++;
			if (cnt[x]<(int)D[x].sz) baga( mp( D[x][ cnt[x] ]+cst[x], x ) );
		}
	}


	for (int i=0;i<min(k,(int)D[1].sz);i++)
		printf("%d ",D[1][i]);
	return 0;
}