Pagini recente » Cod sursa (job #2862162) | Cod sursa (job #2189468) | Cod sursa (job #507970) | Cod sursa (job #2060482) | Cod sursa (job #703258)
Cod sursa(job #703258)
#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]);
}