Pagini recente » Cod sursa (job #1193530) | Cod sursa (job #39710) | Cod sursa (job #248155) | Cod sursa (job #1019140) | Cod sursa (job #2038579)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#define INF 1999999999
#define PW (1<<15)
#define DN 2005
#define DK 17
using namespace std;
fstream fin("ubuntzei.in",ios::in),fout("ubuntzei.out",ios::out);
vector<pair<int,int>> v[DN];
priority_queue<pair<int,int> > p;
int N,M,K,k[DK],d[DK][DN],bst[PW+4][DK];
void dijkstra(int nod);
void citire();
void citire()
{
int i,a,b,c;
fin>>N>>M>>K;k[K]=1;
for(i=0;i<K;i++) fin>>k[i];
for(i=0;i<M;i++)
{
fin>>a>>b>>c;
v[a].push_back({b,c});
v[b].push_back({a,c});
}
}
void dijkstra(int nod)
{
int c,x,y,cost,aux,i;
for(i=1;i<=N;i++) d[nod][i]=INF;
p.push({0,k[nod]}); d[nod][k[nod]]=0;
while(p.empty()==0)
{
c=-p.top().first;x=p.top().second;p.pop();
for(i=0;i<v[x].size();i++)
{
y=v[x][i].first;cost=v[x][i].second;
if(d[nod][y]>c+cost)
{
d[nod][y]=c+cost;
p.push({-d[nod][y],y});
}
}
}
}
int main()
{
int msk1,msk2,i,j,t1,t2,minim=INF;
citire();
for(i=0;i<=K;i++) dijkstra(i);
for(i=0;i<K;i++) for(msk1=1;msk1<(1<<K);msk1++) bst[msk1][i]=INF;
for(i=0;i<K;i++) bst[(1<<i)][i]=d[K][k[i]];
for(msk1=1;msk1<(1<<K);msk1++)
{
for(t1=0;t1<K;t1++)
{
if((msk1&(1<<t1)))//t1-ul se gaseste in msk
{
for(t2=0;t2<K;t2++)
{
if((msk1&(1<<t2))==0)//t2 nu se gaseste in msk
{
msk2=(msk1|(1<<t2));
if(bst[msk2][t2]>bst[msk1][t1]+d[t1][k[t2]])
{
bst[msk2][t2]=bst[msk1][t1]+d[t1][k[t2]];
}
}
}
}
}
}
for(i=0;i<K;i++)
{
if(minim>=bst[(1<<K)-1][i]+d[i][N])
{
minim=bst[(1<<K)-1][i]+d[i][N];
}
}
if(K==0)
fout<<d[K][N]<<"\n";
else
fout<<minim<<"\n";
}