Pagini recente » Istoria paginii runda/casi/clasament | Cod sursa (job #1798502) | Cod sursa (job #2493212) | Cod sursa (job #1961536) | Cod sursa (job #1473908)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#define maxN 200
#define maxK 17
#define maxP 32770
#define inf 1000000000
using namespace std;
int n, N[maxP], m, p, i, j, k, c[maxK], f[maxN], d[maxN][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);
p = 1 << k;
for (i = 1; i <= k; ++ i)
{
scanf("%d", &c[i]);
f[c[i]] = i;
}
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 <= n; ++ i)
for (j = 0; j < p; ++ j)
d[i][j] = inf;
d[1][0] = 0;
q[0].push(1);
for (j = 0; j < p; ++ j)
{
while (!q[j].empty())
{
x = q[j].front();
//used[x][j] = 1;
q[j].pop();
for (i = 0; i < V[x].size(); ++ i)
{
node = V[x][i].first;
if (!f[node])
{
if (d[node][j] > d[x][j] + V[x][i].second)
{
d[node][j] = d[x][j] + V[x][i].second;
q[j].push(node);
}
}
else
{
int Pow = 1 << (f[node] - 1);
if (d[node][j + Pow] > d[x][j] + V[x][i].second)
{
d[node][j + Pow] = d[x][j] + V[x][i].second;
q[j + Pow].push(node);
}
}
}
}
}
}
void write()
{
freopen("ubuntzei.out", "w", stdout);
printf("%d", d[n][p - 1]);
}
int main()
{
read();
solve();
write();
return 0;
}