Pagini recente » Autentificare | Cod sursa (job #2013933) | Arhiva de probleme | Cod sursa (job #477556) | Cod sursa (job #1121645)
#include<fstream>
#include<algorithm>
#define INF 99999999
#define N 2001
#define K 16
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
long long n,m,k,a[N][N],oras[K],luat[K];
void royfloyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
a[j][i]=a[i][j];}
}
int cmin=INF;
void verifica()
{
int i,cost=0;
for(i=1;i<=k+1;i++)
cost+=a[oras[i]][oras[i-1]];
cmin=min(cmin,cost);
}
/*void gen(int p)
{
if(p>k)
verifica();
else
for(int i=1;i<=k;i++)
if(!luat[i])
{
sol[p]=i;
luat[i]=1;
gen(p+1);
luat[i]=0;
}
}*/
int main()
{
fin>>n>>m;
int i,j,x,y,c;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
a[i][j]=a[j][i]=INF;
fin>>k;
for(i=1;i<=k;i++)
fin>>oras[i];
for(i=1;i<=m;i++)
{fin>>x>>y>>c;
a[x][y]=a[y][x]=c;}
royfloyd();
oras[0]=1;
oras[k+1]=n;
sort(oras+1,oras+k+1);
verifica();
while(next_permutation(oras+1,oras+k+1))
verifica();
fout<<cmin;
return 0;
}