Pagini recente » Cod sursa (job #2264079) | Cod sursa (job #1686962) | Cod sursa (job #1552712) | Cod sursa (job #2782632) | Cod sursa (job #1473926)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define maxN 2002
#define maxK 17
#define maxP 32770
#define inf 2000000000
using namespace std;
int n, N[maxP], m, p, i, j, k, c[maxK], f[maxN], d[maxN], dist[maxK][maxP];
vector < pair <int, int> > V[maxN];
queue < int > q[maxP];
void read()
{
int x, y, z;
freopen("ubuntzei.in", "r", stdin);
scanf("%d %d", &n, &m);
scanf("%d", &k);
for (i = 1; i <= k; ++ i)
{
scanf("%d", &c[i]);
f[c[i]] = i;
}
f[n] = ++ k;
p = 1 << k;
for (i = 1; i <= m; ++ i)
{
scanf("%d %d %d", &x, &y, &z);
V[x].push_back(make_pair(y, z));
V[y].push_back(make_pair(x, z));
}
}
void solve()
{
int x, node;
for (i = 1; i <= k; ++ i)
for (j = 0; j < p; ++ j)
dist[i][j] = inf;
q[0].push(1);
for (j = 0; j < p; ++ j)
{
for (i = 1; i <= n; ++ i)
d[i] = inf;
if (j == 0)
d[1] = 0;
while (!q[j].empty())
{
x = q[j].front();
if (f[x])
d[x] = dist[f[x]][j];
q[j].pop();
for (i = 0; i < V[x].size(); ++ i)
{
node = V[x][i].first;
if (!f[node])
{
if (d[node] > d[x] + V[x][i].second)
{
d[node] = d[x] + V[x][i].second;
q[j].push(node);
}
}
else
{
int Pow = 1 << (f[node] - 1);
if (dist[f[node]][j + Pow] > d[x] + V[x][i].second)
{
dist[f[node]][j + Pow] = d[x] + V[x][i].second;
q[j + Pow].push(node);
}
}
}
}
}
}
void write()
{
freopen("ubuntzei.out", "w", stdout);
printf("%d", dist[k][p - 1]);
}
int main()
{
read();
solve();
write();
return 0;
}