Pagini recente » Cod sursa (job #1869986) | Cod sursa (job #2438791) | Cod sursa (job #925016) | Cod sursa (job #1902373) | Cod sursa (job #695155)
Cod sursa(job #695155)
#include<cstdio>
#include<iostream>
#define INT_MAX 99999
using namespace std;
FILE *fin=fopen("ubuntzei.in","r");
FILE *fout=fopen("ubuntzei.out","w");
int n,m,k,K[16],i,j,ct,cmin=INT_MAX;
int cost[2001][2001];
int x[17];
//clock_t start,stop;
int test(int k)
{
for(int i=1;i<k;i++)
if(x[i]==x[k]) return 0;
return 1;
}
int bk(int k1)
{
x[k1]=0;
while(x[k1]<k)
{
x[k1]++;
if(test(k)){
ct+=cost[K[x[k1-1]]][K[x[k1]]];
if(k1==k) {
cmin=min(cmin,ct+cost[1][K[x[1]]]+cost[K[x[k]]][n]);
}
else bk(k1+1);
ct-=cost[K[x[k1-1]]][K[x[k1]]];
}
}
}
int main()
{
//start=clock();
fscanf(fin,"%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
fscanf(fin,"%d",&K[i]);
for(i=1;i<=m;i++)
{
int x1,y1,ct;
fscanf(fin,"%d%d%d",&x1,&y1,&ct);
cost[x1][y1]=cost[y1][x1]=ct;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(cost[i][j]==0 && i!=j) cost[i][j]=INT_MAX;
for(int z=1;z<=n;z++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(cost[i][z]!=INT_MAX && cost[z][j]!=INT_MAX)
if(cost[i][j]>cost[i][z]+cost[z][j])
cost[i][j]=cost[i][z]+cost[z][j];
/*for(i=1;i<=k;i++)
fprintf(fout,"%d ",cost[1][K[i]]);*/
bk(1);
fprintf(fout,"%d\n",cmin);
//stop=clock();
//cout<<"timp "<<(float)(stop-start)/CLK_TCK<<" sec\n";
}