Pagini recente » Cod sursa (job #2142050) | Cod sursa (job #2310231) | Cod sursa (job #2617365) | Cod sursa (job #3168111) | Cod sursa (job #874231)
Cod sursa(job #874231)
#include<fstream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int maxx=100000;
int a[2001][2001],k,n,m,p[2001],x[2001],l[2001],dmin=1000000000;
void citire()
{
int i,j,x,c;
fin>>n>>m>>k;
for(i=1;i<=k;i++) fin>>l[i];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
a[i][j]=a[j][i]=maxx;
for(x=1;x<=m;x++)
{ fin>>i>>j>>c;
a[i][j]=c;
a[j][i]=c;
}
}
void rf()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j)
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
void afis()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
if(a[i][j]!=maxx) fout<<a[i][j]<<" ";
else fout<<"# ";
fout<<"\n";
}
}
void calcul()
{
int dist=a[1][l[x[1]]],i;
for(i=2;i<=k;i++)
dist=dist+a[l[x[i-1]]][l[x[i]]];
dist=dist+a[l[x[k]]][n];
if(dist<dmin) dmin=dist;
}
void perm(int n, int k)
{ for(int i=1;i<=n;i++)
if(!p[i])
{ x[k]=i;
p[i]=1;
if(k==n) calcul();
else perm(n,k+1);
p[i]=0;
}
}
int main()
{
citire();
rf();
if(k>0) perm(k,1);
else dmin=a[1][n];
//fis();
fout<<dmin;
fin.close();
fout.close();
return 0;
}