Pagini recente » Cod sursa (job #3152341) | Cod sursa (job #608599) | Cod sursa (job #1059373) | Cod sursa (job #301662) | Cod sursa (job #2167495)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#define MAX 2020
#define INF 99999999
#define pp pair < int , int >
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n, m, K, ceva[MAX], dist[2001][2001], dp[(1<<15)][15];
vector < pair < int , int > > v[MAX];
priority_queue < pp, vector < pp > , greater < pp > > q;
void read()
{
int x, y, d;
f>>n>>m;
f>>K;
//ceva[K+1]=n;
for(int i=1; i<=K; i++)
f>>ceva[i];
for(int i=1; i<=m; i++)
{
f>>x>>y>>d;
v[x].push_back({y, d});
v[y].push_back({x, d});
}
ceva[0]=1;
ceva[K+1]=n;
for(int i=0; i<=K+1; i++)
{
for(int j=1; j<=n; j++)
dist[ceva[i]][j]=INF;
q.push({0, ceva[i]});
dist[ceva[i]][ceva[i]]=0;
while(!q.empty())
{
int nod = q.top().second;
int dis = q.top().first;
q.pop();
if(dis!=dist[ceva[i]][nod])
continue;
for(auto it:v[nod])
{
if(dist[ceva[i]][it.first]>dist[ceva[i]][nod]+it.second)
{
dist[ceva[i]][it.first] = dist[ceva[i]][nod]+ it.second;
q.push({dist[ceva[i]][it.first], it.first});
}
}
}
}
}
int main()
{
read();
if(!K)
{
g<<dist[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] = dist[1][ceva[i]];
for(int conf = 2; conf<(1<<K); conf++)
{
for(int i=1; i<=K; i++)
{
if((conf>>(i-1))&1)
{
for(int k=1; k<=K; k++)
{
dp[conf][i] = min(dp[conf][i] , dp[conf^(1<<(i-1))][k] + dist[ceva[i]][ceva[k]]);
}
}
}
}
int rez=INF;
for(int i=1; i<=K; i++)
rez=min(rez, dp[(1<<K)-1][i] + dist[ceva[i]][n]);
g<<rez;
f.close();
g.close();
}