Pagini recente » Cod sursa (job #686898) | Cod sursa (job #931105) | Cod sursa (job #1499337) | Cod sursa (job #2092327) | Cod sursa (job #2334728)
#include <fstream>
#include <vector>
#include <queue>
#define F first
#define S second
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int NR=25;
const int NODES=2005;
const int VAL=132005;
const int INF=2000000000;
int N, M, K, U[NR], i, j;
int A, B, C, nod, conf;
int cost[NR][NODES];
int dp[NR][VAL], X;
vector < pair <int, int> > G[NODES];
vector < pair <int, int> > :: iterator it;
queue <int> Q;
void BFS(int poz)
{
cost[poz][U[poz]]=0;
Q.push(U[poz]);
while (Q.empty()==false)
{
nod=Q.front();
Q.pop();
for (it=G[nod].begin(); it!=G[nod].end(); it++)
{
if (cost[poz][it->F]>cost[poz][nod]+it->S)
{
cost[poz][it->F]=cost[poz][nod]+it->S;
Q.push(it->F);
}
}
}
}
int main()
{
fin >> N >> M >> K;
U[0]=1;
U[++K]=N;
for (i=1; i<K; i++)
fin >> U[i];
for (i=1; i<=M; i++)
{
fin >> A >> B >> C;
G[A].push_back({B, C});
G[B].push_back({A, C});
}
for (i=0; i<=K; i++)
{
for (j=1; j<=N; j++)
cost[i][j]=INF;
for (j=0; j<=(1 << (K+1)); j++)
dp[i][j]=INF;
}
for (i=0; i<=K; i++)
BFS(i);
dp[0][1]=0;
for (conf=0; conf<(1 << (K+1)); conf++)
{
for (i=0; i<=K; i++)
{
if ((conf & (1 << i))!=0)
continue;
for (j=0; j<=K; j++)
{
if ((conf & (1 << j))==0)
continue;
X=dp[j][conf]+cost[j][U[i]];
dp[i][conf+(1 << i)]=min(dp[i][conf+(1 << i)], X);
}
}
}
fout << dp[K][(1 << (K+1))-1] << '\n';
fin.close();
fout.close();
return 0;
}