Cod sursa(job #36070)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 22 martie 2007 22:11:36
Problema Pitici Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
# include <stdio.h>
# include <string.h>

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

# define  maxn  2048
# 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;
}

int a[maxn], C[maxn];

void solve()
{
	df(1), b[1][0]=1, b[1][1]=0;
	int ii, sum, to;
	int I, J, K;

	for (ii=n; ii>=2; ii--)
		for (node=ord[ii], i=1; i<=v[node][0]; i++)
		{
			to = v[node][i];

			for (a[0]=0, j=1; j<=b[node][0]; j++)
				a[ ++a[0] ] = b[node][j] + c[node][i];
			// interclaseaza vectorul a cu vectorul b[to]
			for (I=1, J=1, K=1; (I<=a[0] || J<=b[to][0]) && K<=k; )
				if ( J>b[to][0] || (I<=a[0] && a[I] < b[to][J]) )
					C[ K++ ] = a[I++];
				else
					C[ K++ ] = b[to][J++];

			for (I=1; I<K; I++)
				b[to][I] = C[I];
			b[to][0] = K-1;
//			for (i=l, j=m+1, k=l; i<=m || j<=r; )
//				b[ k++ ] = a[ j>r || (i<=m && a[i]<a[j]) ? i++ : j++ ];
//			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;
}