Pagini recente » Cod sursa (job #2862636) | Cod sursa (job #2138483) | Cod sursa (job #2556460) | Cod sursa (job #2439404) | Cod sursa (job #968659)
Cod sursa(job #968659)
#include<stdio.h>
#include<vector>
#define pb push_back
#define mp make_pair
#define maxn 2005
#define maxk 20
#define inf 999999999
using namespace std;
int n,m,nrc,dmin=inf;
int c[maxk],v[maxn],d[maxn],x[maxk],uz[maxn];
int a[maxn][maxn];
vector < pair<int,int> > l[maxn];
void cit()
{
int i;
int a,b,cost;
scanf("%d%d%d",&n,&m,&nrc);
for(i=1;i<=nrc;i++) scanf("%d",&c[i]);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&cost);
l[a].pb(mp(b,cost));
l[b].pb(mp(a,cost));
}
}
void dijkstra(int nod)
{
int i1,i,j;
int minn,k;
for(i=1;i<=n;i++) { d[i]=inf; v[i]=0; }
d[nod]=0;
for(i1=1;i1<=n;i1++)
{
minn=inf;
for(j=1;j<=n;j++)
if(v[j]==0 && minn>d[j])
{
minn=d[j];
k=j;
}
v[k]=1;
for(unsigned int i=0;i<l[k].size();i++)
if(v[l[k][i].first]==0 && d[k]+l[k][i].second<d[l[k][i].first])
d[l[k][i].first]=d[k]+l[k][i].second;
}
}
void drum()
{
int i,j;
dijkstra(1); for(i=1;i<=n;i++) a[1][i]=d[i];
for(i=1;i<=nrc;i++)
{
dijkstra(c[i]);
for(j=1;j<=n;j++) a[c[i]][j]=d[j];
}
}
void update()
{
int i;
int s=0;
for(i=1;i<nrc;i++)
s+=a[x[i]][x[i+1]];
s+=a[1][x[1]]+a[x[nrc]][n];
if(dmin>s) dmin=s;
}
void back(int k)
{
int i;
if(k>nrc) update();
else
for(i=1;i<=nrc;i++)
if(uz[c[i]]==0)
{
x[k]=c[i];
uz[c[i]]=1;
back(k+1);
uz[c[i]]=0;
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
cit();
drum();
back(1);
printf("%d",dmin);
fclose(stdin);
fclose(stdout);
return 0;
}