Pagini recente » Cod sursa (job #603335) | Cod sursa (job #1246928) | Cod sursa (job #1410674) | Cod sursa (job #521929) | Cod sursa (job #968135)
Cod sursa(job #968135)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define Nmax 2010
#define PI pair<int, int>
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define Inf 0x3f3f3f3f
int N, M, X, Y, Z, K, C[16], Dist[Nmax][Nmax], Dp[1 << 15][15], Pow[16];
vector<PI> G[Nmax];
priority_queue<PI, vector<PI>, greater<PI> > Q;
void Dijkstra(int StartNode, int V[])
{
for(int i = 1; i <= N; ++ i)
V[i] = Inf;
Q.push(mp(0, StartNode));
V[StartNode] = 0;
while(!Q.empty())
{
int Node = Q.top().s, Cost = Q.top().f;
Q.pop();
if(V[Node] < Cost) continue;
for(vector<PI> :: iterator it = G[Node].begin(); it != G[Node].end(); ++ it)
if(V[it -> f] > V[Node] + it -> s)
{
V[it -> f] = V[Node] + it -> s;
Q.push(mp(V[it -> f], it -> f));
}
}
}
int main()
{
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%i %i", &N, &M);
scanf("%i", &K);
Pow[0] = 1;
for(int i = 0; i < K; ++ i)
{
scanf("%i", &C[i]);
if(i > 0) Pow[i] = Pow[i - 1] * 2;
}
Pow[K] = Pow[K - 1] * 2;
for(int i = 1; i <= M; ++ i)
{
scanf("%i %i %i", &X, &Y, &Z);
G[X].pb(mp(Y, Z));
G[Y].pb(mp(X, Z));
}
for(int i = 1; i <= N; ++ i)
Dijkstra(i, Dist[i]);
if(K == 0)
{
printf("%i\n", Dist[1][N]);
return 0;
}
memset(Dp, Inf, sizeof(Dp));
for(int i = 0; i < K; ++ i) Dp[Pow[i]][i] = Dist[1][ C[i] ];
for(int Conf = 1; Conf < Pow[K]; ++ Conf)
for(int i = 0; i < K; ++ i)
if(Conf & Pow[i])
for(int j = 0; j < K; ++ j)
if(i != j && Conf & Pow[j])
Dp[Conf][i] = min(Dp[Conf][i], Dp[Conf - Pow[i]][j] + Dist[ C[j] ][ C[i] ]);
int Ans = Inf;
for(int i = 0; i < K; ++ i)
Ans = min(Ans, Dp[Pow[K] - 1][i] + Dist[ C[i] ][N]);
printf("%i\n", Ans);
return 0;
}