Cod sursa(job #36092)

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

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

# define  maxn  1020
# define  maxm  200020


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

int getnum(int &poz)
{
	int ret=0;
	while ( row[poz]<=0x39 && row[poz]>=0x30 )
		ret = ret * 10 + row[poz]-0x30, ++poz;
	++poz;
	return ret;
}

void readf()
{
	//freopen(_fin, "r", stdin);
	FILE *fin = fopen(_fin, "r");
	int aux=0;
	
	for (fscanf(fin, "%d%d%d\n", &n, &m, &k), i=1; i<=m; i++)
	{
		fgets(row, 64, fin);
		aux=0;
		bx[i] = getnum(aux), by[i] = getnum(aux), bc[i] = getnum(aux);
		
		++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];
}

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 (I=1, J=1, K=1; (I<=b[node][0] || J<=b[to][0]) && K<=k; K++)
				if ( J>b[to][0] || (I<=b[node][0] && b[node][I]+c[node][i] < b[to][J] ) )
					C[ K ] = b[node][I++] + c[node][i];
				else
					C[ K ] = b[to][J++];
				
/*			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++];*/

			memcpy(b[to], C, sizeof(int)*K);
			b[to][0] = K-1;
		}
}

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