Pagini recente » Cod sursa (job #811257) | Cod sursa (job #3210089) | Cod sursa (job #1456025) | Cod sursa (job #3253968) | Cod sursa (job #3210185)
#include <fstream>
#include <queue>
#include <set>
using namespace std;
ifstream fin ("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct elem
{
int nod,c;
};
struct cmp
{
bool operator()(const elem& a,const elem& b)const{
if(a.c==b.c)
return a.nod<b.nod;
return a.c<b.c;
}
};
const int INF=1e9;
int P,n,m,k,x,y,j,cost,i,V[18],dist[21][21],D[2001],sol[(1<<17)][21];
vector <elem> L[2003];
set <elem,cmp> S;
int main()
{
fin>>n>>m;
fin>>k;
for(i=1;i<=k;i++)
fin>>V[i];
for(i=1;i<=m;i++)
{
fin>>x>>y>>cost;
L[x].push_back({y,cost});
L[y].push_back({x,cost});
}
V[0]=1;
V[k+1]=n;
for(i=0;i<=k+1;i++)
{
for(j=1;j<=n;j++)
D[j]=INF;
S.insert({V[i],0});
D[V[i]]=0;
while(!S.empty())
{
int fr=S.begin()->nod;
S.erase(S.begin());
for(auto l:L[fr])
{
if(D[l.nod]>D[fr]+l.c)
{
S.erase({l.nod,D[l.nod]});
D[l.nod]=D[fr]+l.c;
S.insert({l.nod,D[l.nod]});
}
}
}
for(j=0;j<=k+1;j++)
{
dist[i][j]=D[V[j]];
dist[j][i]=D[V[j]];
}
dist[i][i]=INF;
}
for(i=0;i<(1<<(k+2));i++)
for(j=0;j<=k+1;j++)
sol[i][j]=INF;
sol[0][0]=0;
dist[0][0]=0;
for(i=0;i<(1<<(k+2));i++)
for(j=0;j<k+2;j++)
if(i&(1<<j))
for(int l=0;l<k+2;l++)
sol[i][j]=min(sol[i][j],sol[i-(1<<j)][l]+dist[l][j]);
fout<<sol[(1<<(k+2))-1][k+1];
return 0;
}