Cod sursa(job #199541)

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

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];
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > hp;
int n,m,k,dimh;
int gr[NMAX];
int cnt[NMAX],cst[NMAX];
vector<int> D[NMAX];

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];
		while (hp.sz) hp.pop();

		for (int j=0;j<(int)G[nod].sz;j++)
		{
			if (D[ G[nod][j].ff ].sz) hp.push( 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,hp.sz);

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

			cnt[x]++;
			if (cnt[x]<(int)D[x].sz) hp.push( 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;
}