Cod sursa(job #36061)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 22 martie 2007 21:47:35
Problema Pitici Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
# include <stdio.h>
# include <string.h>

# define  _fin  "pitici.in"
# define  _fout "pitici.out"

# define  maxn  1024
# define  maxm  200024


int *v[maxn], *c[maxn],
	bx[maxm], by[maxm], bc[maxm], cnt[maxn],
	b[maxn][maxn],
	n, m, k, i, j, node;

void readf()
{
	freopen(_fin, "r", stdin);
	
	for (scanf("%d%d%d", &n, &m, &k), i=1; i<=m; i++)
		 scanf("%d%d%d", bx+i, by+i, bc+i), ++cnt[bx[i]];
	
	for (i=1; i<=n; i++)
		v[i] = new int[ cnt[i]+1 ], v[i][0]=0,
		c[i] = new int[ cnt[i]+1 ];
	
	for (i=1; i<=m; i++)
		v[bx[i]][++v[bx[i]][0]] = by[i],
		c[bx[i]][ v[bx[i]][0] ] = bc[i];
}

void update(int nd, int d)
{
	if ( !b[nd][0] ) b[nd][0]=1, b[nd][1]=d;
	
	else {
		int step, i, j;
		for (step=1; step<=b[nd][0]; step<<=1); step>>=1;
		for (i=1; step; step>>=1)
			if ( i+step <= b[nd][0] )
				if ( b[nd][i+step] <= d ) i += step;
		
		while ( b[nd][i] <= d && i<=b[nd][0] ) ++i;
		
		if ( i <= k ) {
				for (j=b[nd][0]; j>=i; j--) b[nd][j+1] = b[nd][j];
				b[nd][i]=d;
				if ( b[nd][0] < k ) ++b[nd][0];
			}
	}
}

int viz[maxn], ord[maxn];

void df(int node)
{
	int i; viz[node]=1;
	for (i=1; i<=v[node][0]; i++)
		if ( !viz[ v[node][i] ] ) df( v[node][i] );
	ord[++ord[0]] = node;
}

void solve()
{
	df(1), b[1][0]=1, b[1][1]=0;
	int ii;
	
	for (ii=n; ii>=2; ii--)
		for (node=ord[ii], i=1; i<=v[node][0]; i++)
			for (j=1; j<=b[node][0]; j++)
				update(v[node][i], b[node][j] + c[node][i]);
}

void writef()
{
	freopen(_fout,"w", stdout);
	for (i=1; i<k; i++) printf("%d ", b[n][i]); printf("%d\n", b[n][i]);
}

int main()
{
	readf();
	solve();
	writef();
	
	return 0;
}