Pagini recente » Cod sursa (job #3290424) | Cod sursa (job #564587) | Cod sursa (job #3032771) | Cod sursa (job #2665432) | Cod sursa (job #3279963)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 2005, M_MAX = 10005, K_MAX = 15, MASK_MAX = 1 << 15, INF = 1 << 28;
int N, M, K, maxMask;
int mask[N_MAX];
struct Edge
{
int v, c;
Edge(int _v, int _c) :
v(_v), c(_c) { }
};
vector<Edge> G[N_MAX];
void SetInput(string name)
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
(void)!freopen((name + ".in").c_str(), "r", stdin);
(void)!freopen((name + ".out").c_str(), "w", stdout);
}
void ReadInput()
{
cin >> N >> M >> K;
maxMask = (1 << K) - 1;
for(int i = 1; i <= N; i++)
mask[i] = 0;
for(int i = 0, v; i < K; i++)
{
cin >> v;
mask[v] = 1 << i;
}
for(int i = 0, u, v, c; i < M; i++)
{
cin >> u >> v >> c;
G[u].emplace_back(v, c);
G[v].emplace_back(u, c);
}
}
void BellmanFord()
{
vector<vector<int> > dist(N + 1, vector<int>(maxMask + 1, INF));
vector<bitset<MASK_MAX> > inQueue(N + 1, 0);
queue<pair<int, int> > Q;
dist[1][mask[1]] = 0;
Q.emplace(1, mask[1]);
while(not Q.empty())
{
auto [v, prevMask] = Q.front();
Q.pop();
inQueue[v][prevMask] = 0;
int d = dist[v][prevMask];
int newMask;
for(auto& [u, c] : G[v])
{
newMask = prevMask | mask[u];
if(dist[u][newMask] > d + c)
{
dist[u][newMask] = d + c;
if(not inQueue[u][newMask])
{
Q.emplace(u, newMask);
inQueue[u][newMask] = 1;
}
}
}
}
cout << dist[N][maxMask];
}
int main()
{
SetInput("ubuntzei");
ReadInput();
BellmanFord();
return 0;
}