Cod sursa(job #115401)

Utilizator mithyPopovici Adrian mithy Data 16 decembrie 2007 12:32:27
Problema Gather Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 2, Clasele 11-12 Marime 1.36 kb
#include <stdio.h>
#define NMax 751

int n, m, k;

int drum[NMax][NMax];
int detm[NMax][NMax];
int detinuti[NMax];

void citire();
void rez();

int main()
{
	citire();
	rez();
	return 0;
}
void rez()
{
	int pozc = 1, pozn, detx = 1, costx = 0, i;

	while ( detx < k+1 )
	{
		for (i=1; i<=n; i++)
			if ( i != pozc && // daca celula selectata e diferita de cel curenta
				 drum[pozc][i] && // si daca am drum
				 detx <= detm[pozc][i] ) // si daca am loc
		 {
			pozn = i; // atunci selectez pozitia
			break;
		 }

		for (++i; i<=n; i++)
		{
			if ( !detinuti[pozn] && detinuti[i] && detx <= detm[pozc][i] )
			{
				// merg intr-o celula cu detinut
				pozn = i;
			}
			if ( detinuti[pozn] && detinuti[i] && drum[pozc][pozn] > drum[pozc][i] && detx <= detm[pozc][i] )
			{
				pozn = i;
			}
		}

		costx += (drum[pozc][pozn]*detx);
		if (detinuti[pozn] )
			detx++;
		detinuti[pozn] = 0;
		pozc = pozn;
	}

	
	FILE *g = fopen( "gather.out", "wt" );
	fprintf( g, "%d\n", costx );
}
void citire()
{
	int i, j, aux, x, y, l, c;
	FILE *f = fopen( "gather.in", "rt" );

	fscanf( f, "%d %d %d", &k, &n, &m );
	for (i=0; i<k; i++)
	{
		fscanf( f, "%d", &aux );
		detinuti[aux]++;
	}
	for (i=0; i<m; i++)
	{
		fscanf( f, "%d %d %d %d", &x, &y, &l, &c );
		drum[x][y] = drum[y][x] = l;
		detm[x][y] = detm[y][x] = c;
	}
}