Cod sursa(job #703368)

Utilizator mihai_bogdaannMihai Bogdan mihai_bogdaann Data 2 martie 2012 12:03:30
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#define NMAX 2001
#define KMAX 16
#define min(a,b) a<b?a:b

FILE *fin = fopen("ubuntzei.in","r");
FILE *fout = fopen("ubuntzei.out","w");

int a[NMAX][NMAX],viz[KMAX],sol[KMAX],n,m,k,orase[KMAX+3],x,y,lg,z,i,j,lgTraseu,lgMin=999999,suma,b;

void bkt(int k)
{
	int i;
	if(k == lgTraseu+1)
	{
		suma=0;
		suma = a[1][sol[1]];
		for(i=2; i<=lgTraseu;i++)
			suma+=a[sol[i-1]][sol[i]];
		suma+=a[sol[lgTraseu]][n];
		if(suma<lgMin && suma)
			lgMin=suma;
	}
	else
	{
		for(i=1;i<=lgTraseu;i++)
			if(!viz[i])
			{
				sol[k]=orase[i];
				viz[i]=1;
				bkt(k+1);
				viz[i]=0;
			}
	}
}

int main()
{
	fscanf(fin,"%d%d",&n,&m);
	fscanf(fin,"%d",&k);
	lgTraseu = k;
	for(i=1; i <= k; i++)
		fscanf(fin,"%d",&orase[i]);
	for(i=1;i<n;i++)
		for(j=i+1;j<=n;j++)
			a[i][j]=a[j][i]=999999;
	for(i=1;i<=m;i++)
	{
		fscanf(fin,"%d%d%d",&x,&y,&lg);
		a[x][y] = a[y][x] = lg;
	}
	

	
	for(z=1;z<=n;z++)
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				b=a[i][z]+a[z][j],a[i][j] = min(a[i][j],b);
	bkt(1);
	if(lgMin != 999999) 
		fprintf(fout,"%d",lgMin);
	else
		fprintf(fout,"%d",a[1][n]);
}