Pagini recente » Cod sursa (job #1042394) | Cod sursa (job #1699132) | Cod sursa (job #1316983) | Cod sursa (job #106847) | Cod sursa (job #2041418)
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define lim 2010
#define inf 1<<28
int n, m, k;
int path[lim][lim], o[20], dp[1<<16][17];
vector < pair <int,int> > G[lim];
priority_queue < pair <int,int> > PQ;
int main()
{
int aa,bb,cc;
fin>>n>>m>>k;
for (int i=1; i<=k; i++)
fin>>o[i];
for (int i=1; i<=m; i++)
{
fin>>aa>>bb>>cc;
G[aa].push_back({bb,cc});
G[bb].push_back({aa,cc});
}
o[0]=1;
o[k+1]=n;
for (int i=0; i<=k+1; i++)
{
for (int j=1; j<=n; j++)
path[o[i]][j]=inf;
path[o[i]][o[i]]=0;
PQ.push({0,o[i]});
///cout<<i<<"\n";
while(!PQ.empty())
{
int nod=PQ.top().second;
int cost=PQ.top().first;
PQ.pop();
if (path[o[i]][nod]!= cost) continue;
for (auto it:G[nod])
if (path[o[i]][it.first] > path[o[i]][nod] + it.second)
{
path[o[i]][it.first] = path[o[i]][nod] + it.second;
PQ.push({path[o[i]][it.first],it.first});
}
}
}
if(k==0)
{
fout<<path[1][n];
return 0;
}
for (int i=0; i<(1<<k); i++)
for (int j=0; j<=k; j++)
dp[i][j]=inf;
for (int i=1; i<=k; i++)
dp[1<<(i-1)][i] = path[1][o[i]];
for (int mask=2; mask<(1<<k); mask++)
for (int j=1; j<=k; j++)
if ((mask>>(j-1))&1)
for (int kk=1; kk<=k; kk++)
{
dp[mask][j] = min (dp[mask][j] , dp[mask^(1<<(j-1))][kk] + path[o[kk]][o[j]]);
}
int rez=inf;
for (int i=1; i<=k; i++)
rez = min (rez, dp[(1<<k)-1][i] + path[o[i]][n]);
fout<<rez;
fin.close();
fout.close();
return 0;
}