Cod sursa(job #703258)

Utilizator mihai_bogdaannMihai Bogdan mihai_bogdaann Data 2 martie 2012 11:38:26
Problema Ubuntzei Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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)
	{
		if(lgMin>suma+a[sol[k-1]][n])
			lgMin = suma+a[sol[k-1]][n];
	}
	else
	{
		for(i=1;i<=lgTraseu;i++)
			if(!viz[orase[i]])
			{
				sol[k]=orase[i];
				suma += a[sol[k-1]][sol[k]];
				viz[orase[i]]=1;
				bkt(k+1);
				suma -= a[sol[k-1]][sol[k]];
				viz[orase[i]]=0;
			}
	}
}

int main()
{
	fscanf(fin,"%d%d",&n,&m);
	fscanf(fin,"%d",&k);
	lgTraseu = k+1;
	orase[1] = 1;
	for(i=2; i <= k+1; 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);
	viz[1] = 1;
	sol[1] = 1;
	bkt(2);
	if(lgMin != 999999) 
		fprintf(fout,"%d",lgMin);
	else
			fprintf(fout,"%d",a[1][n]);
}