Pagini recente » Cod sursa (job #683618) | Cod sursa (job #181597) | Cod sursa (job #2649126) | Cod sursa (job #1025974) | Cod sursa (job #2127054)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int dp[20][1<<17],k,m,n,vPrieteni[20];
int vDist[2005];
priority_queue <pair<int,int> > q;
vector <pair<int,int> > G[2005];
void citire()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
scanf("%d",&vPrieteni[i]);
int nod1,nod2,cost;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&nod1,&nod2,&cost);
G[nod1].push_back(make_pair(nod2,cost));
G[nod2].push_back(make_pair(nod1,cost));
}
}
void dij(int nod)
{
for(int i=1;i<=n;i++)
{
vDist[i]=0x3f3f3f3f;
}
vDist[nod]=0;
q.push(make_pair(0,nod));
while(!q.empty())
{
int dist=-q.top().first;
int nodCurent=q.top().second;
q.pop();
for(auto it:G[nodCurent])
{
if(vDist[it.first]>vDist[nodCurent]+it.second)
{
vDist[it.first]=vDist[nodCurent]+it.second;
q.push(make_pair(-it.second,it.first));
}
}
}
}
void bitmask()
{
int mCost[20][20];
dij(1);
mCost[0][0]=0;
for(int i=1;i<=k;i++)
{
mCost[0][i]=vDist[vPrieteni[i]];
}
mCost[0][k+1]=vDist[n];
for(int i=1;i<=k;i++)
{
dij(vPrieteni[i]);
mCost[i][0]=vDist[1];
for(int j=1;j<=k;j++)
mCost[i][j]=vDist[vPrieteni[j]];
mCost[i][k+1]=vDist[n];
}
for(int i=0;i<=k+1;i++)
for(int j=1;j<(1<<(k+1));j++)
dp[i][j]=0x3f3f3f3f;
for (int i=0; i<k+2; i++)
dp[i][1<<i]=mCost[i][1];
for(int j=1;j<(1<<(k+2));j++)
for(int i=0;i<k+2;i++)
{
if(j&(1<<i))
for(int z=0;z<k+2;z++)
if(j&(1<<z))
{
dp[i][j]=min(dp[i][j],dp[z][j^(1<<i)]+mCost[z][i]);
}
}
printf("%d",dp[k+1][(1<<k+2)-1]);
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
citire();
bitmask();
return 0;
}