Pagini recente » Cod sursa (job #2674049) | Cod sursa (job #595468) | Cod sursa (job #572685) | Cod sursa (job #879877) | Cod sursa (job #2039653)
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define lim 2010
#define inf 2e9
int n,m;
vector < pair<int,int> > G[lim];
int o[20],k,path[lim][lim];
priority_queue < pair<int,int> > PQ;
int dp[1<<18][18];
int main()
{
int aa,bb,cc;
fin>>n>>m;
fin>>k;
for (int i=1; i<=k; i++) fin>>o[k];
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]});
while (!PQ.empty())
{
int act=PQ.top().second, cost=-PQ.top().first;
PQ.pop();
if (path[o[i]][act]!=cost) continue;
for (auto it:G[act])
if (path[o[i]][it.first] > path[o[i]][act]+it.second)
{
path[o[i]][it.first] = path[o[i]][act]+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 i=1; i<=k; i++)
if (mask&(i<<(i-1)))
for (int j=1; j<=k; j++)
dp[mask][i] = min (dp[mask][i], dp[mask^(1<<(i-1))][k]+path[o[j]][o[i]]);
int rez=1<<28;
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;
}