Cod sursa(job #78853)

Utilizator peanutzAndrei Homorodean peanutz Data 19 august 2007 22:13:55
Problema Team Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#include <memory.h>

#define NMAX 505
#define PMAX 55
#define INFI 0x3f3f3f3f

int c[NMAX][NMAX];
int minim[PMAX][PMAX][PMAX];
int p, n, m;
int dist[PMAX][PMAX];
int dest[PMAX];

void read()
{
	memset(c, INFI, sizeof(c));

	int i;
	int x, y, z;
	scanf("%d%d%d", &p, &n, &m);
	for(i = 1; i <= m; ++i)
	{
		scanf("%d%d%d", &x, &y, &z);
		c[x][y] = c[y][x] = z;
	}
	for(i = 1; i <= p; ++i)
		scanf("%d", dest+i);
}

int dj[PMAX], uz[PMAX];

void djikstra(int s)
{
	int i, j, minim, poz;

	memset(uz, 0, sizeof(uz));
	memset(dj, INFI, sizeof(dj));
	//++uz[s];
	dj[s] = 0;

	for(i = 1; i <= n; ++i)
	{
		for(minim = INFI, j = 1; j <= n; ++j)
			if(!uz[j] && minim > dj[j])
				minim = dj[j], poz = j;

		if(minim == INFI)
			return ;

		for(++uz[poz], j = 1; j <= n; ++j)
			if(!uz[j] && minim + c[poz][j] < dj[j])
				dj[j] = minim + c[poz][j];
    }
}

void cdist()
{
	int i, j;

	dest[0] = 1;
	for(i = 0; i <= p; ++i)
	{
		djikstra(dest[i]);
		for(j = 0; j <= p; ++j)
		{
			dist[i][j] = dj[ dest[j] ];
			//printf("%d ", dist[i][j]);
		}
		//printf("\n");
	}
		
}	

#define MIN(a, b) ((a) < (b)) ? (a) : (b)

int f(int j,int x,int y){
     if (x>y) return 0;
     if (minim[j][x][y]>=0) return minim[j][x][y];
     if (x==y&&j==x) return 0;

     minim[j][x][y]=1000000000;
     
     for (int k=x;k<=y;k++)
         minim[j][x][y]=MIN(minim[j][x][y],dist[j][k]+f(k,x,k-1)+f(k,k+1,y));
         
     return minim[j][x][y];
}




int main()
{
	freopen("team.in", "r", stdin);
	freopen("team.out", "w", stdout);

	read();

	cdist();

	//memset(minim, -INFI, sizeof(minim));
     memset(minim,255,sizeof(minim));

	//for(int i = 0; i <= p; ++i)
		//minim[i][i][i] = 0;

	printf("%d\n", f(0, 1, n));

	return 0;
}