Pagini recente » Rating Andrei Florea (Luur) | Cod sursa (job #2234847) | Cod sursa (job #125769) | Cod sursa (job #2085100) | Cod sursa (job #1918979)
#include <cstdio>
#include <vector>
#define nmax 2001
#define infinit 20000000
using namespace std;
unsigned int n,m,l,x,y,i,j,j1,k,dist,dmin;
int d[nmax][nmax],loc[16],v[10000];
vector <int> a[nmax],c[nmax];
bool viz[16];
void citire()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&l);
for(x=1;x<=l;x++) scanf("%d",&loc[x]);
for(x=1;x<=m;x++)
{
scanf("%d%d%d",&i,&j,&dist);
a[i].push_back(j);
a[j].push_back(i);
c[i].push_back(dist);
c[j].push_back(dist);
}
}
void dijkstra(int i)
{
v[1]=i; k=1;
for(x=1;x<=k;x++)
{
j=v[x];
for(y=0;y<a[j].size();y++)
{
j1=a[j][y];
if(d[i][j1]>d[i][j]+c[j][y])
{
d[i][j1]=d[i][j]+c[j][y];
d[j1][i]=d[i][j1];
v[++k]=j1;
}
}
}
}
void backtracking(unsigned int k)
{
if(k==l+1)
{
dist+=d[loc[v[k-1]]][n];
if(dist<dmin) dmin=dist;
dist-=d[loc[v[k-1]]][n];
}
else
for(unsigned int x=1;x<=l;x++)
if(!viz[x])
{
viz[x]=1;
v[k]=x;
int i=loc[v[k]];
int j=loc[v[k-1]];
dist+=d[i][j];
if(dist<dmin) backtracking(k+1);
dist-=d[i][j];
viz[x]=0;
}
}
int main()
{
citire();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) d[i][j]=infinit;
for(i=1;i<=l;i++)
dijkstra(loc[i]);
loc[0]=1;
dmin=infinit;
dist=0;
backtracking(1);
printf("%d\n",dmin);
return 0;
}