Pagini recente » Statistici Andrei Haski (CreangaIon) | Cod sursa (job #605536) | Istoria paginii utilizator/georgianailie | Cod sursa (job #1092165) | Cod sursa (job #2007554)
#include <bits/stdc++.h>
#define oo LONG_MAX
using namespace std;
const int nmax=2001;
const int kmax=16;
int drumuri[nmax][nmax],n,m,k,prieteni[kmax],dist[nmax],st[nmax],top,solmin=LONG_MAX;
bitset<nmax>viz;
vector<pair<int,int> >L[nmax];
priority_queue<pair<int,int> >mn;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
inline void Read()
{
fin>>n>>m>>k;
for(int i=1;i<=k;i++)
fin>>prieteni[i];
for(int i=1;i<=m;i++)
{
int x,y,cost;
fin>>x>>y>>cost;
L[x].push_back({y,cost});
L[y].push_back({x,cost});
}
}
inline void Reset()
{
viz.reset();
for(int i=1;i<=n;i++)
dist[i]=oo;
}
inline void Dijkstra(int varf)
{
dist[varf]=0;
mn.push({dist[varf],varf});
while(!mn.empty())
{
int x=mn.top().second;
mn.pop();
if(!viz[x])
{
viz[x]=1;
for(int i=0;i<L[x].size();i++)
{
int p=L[x][i].first;
int q=L[x][i].second;
if(dist[p]>dist[x]+q)
{
dist[p]=dist[x]+q;
mn.push({-dist[p],p});
}
}
}
}
for(int i=1;i<=n;i++)
if(!drumuri[varf][i])
drumuri[varf][i]=dist[i];
else drumuri[varf][i]=min(drumuri[varf][i],dist[i]);
}
inline void Build()
{
for(int i=1;i<=n;i++)
{
Reset();
Dijkstra(i);
}
Reset();
}
inline void Solve()
{
int cost=0;
cost+=drumuri[1][st[1]];
for(int i=1;i<k;i++)
cost+=drumuri[st[i]][st[i+1]];
cost+=drumuri[st[k]][n];
solmin=min(solmin,cost);
}
inline void Back(int top)
{
if(top==(k+1))
Solve();
else for(int i=1;i<=k;i++)
if(!viz[i])
{
viz[i]=1;
st[top]=prieteni[i];
Back(top+1);
viz[i]=0;
}
}
int main()
{
Read();
Build();
if(k==0)
fout<<drumuri[1][n]<<"\n";
else
{
Back(1);
fout<<solmin<<"\n";
}
fin.close();
fout.close();
return 0;
}