Pagini recente » Cod sursa (job #2397037) | Cod sursa (job #1402131) | Cod sursa (job #2350631) | Cod sursa (job #1764357) | Cod sursa (job #1104167)
#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 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;
}
}
void inter (int &x, int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void permute(int i, int n)
{
for (int j = i; j <= n; j++)
{
swap(x[i], x[j]);
if(i==n) calcul();
else permute(i+1, n);
swap(x[i], x[j]);
}
}
int main()
{
citire();
rf();
for(int i=1;i<=k;i++) x[i]=k;
//if(k>0) perm(k,1);
//else dmin=a[1][n];
if(k>0) permute(1,k);
else dmin=a[1][n];
fout<<dmin;
fin.close();
fout.close();
return 0;
}