Cod sursa(job #323773)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 13 iunie 2009 14:26:57
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 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];
	    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;
		}
	}


    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));

	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;
}