Pagini recente » Cod sursa (job #2006468) | Cod sursa (job #1352992) | Cod sursa (job #3198001) | Monitorul de evaluare | Cod sursa (job #2941256)
#include <bits/stdc++.h>
using namespace std;
#define INF 1e9
#define MAX_N 2000
#define MAX_K 15
struct Edge { int node, cost; };
struct BfNode { int node, visitedMask; };
int noNodes, noEdges;
vector<Edge> graph[MAX_N];
int noSpecialNodes;
int isSpecialNode[MAX_N];
int dist[MAX_N][1 << MAX_K];
void addSpecialNode(int x) {
isSpecialNode[x] = ++noSpecialNodes;
}
void addEdge(int x, int y, int c) {
graph[x].push_back({y, c});
graph[y].push_back({x, c});
}
void resetDist() {
int i, mask;
for (i = 0; i < noNodes; ++i)
for (mask = 0; mask < (1 << noSpecialNodes); ++mask)
dist[i][mask] = INF;
}
void bf(BfNode node) {
queue<BfNode> bfQueue;
int visitedMask;
resetDist();
bfQueue.push(node);
dist[node.node][node.visitedMask] = 0;
while (!bfQueue.empty()) {
node = bfQueue.front();
bfQueue.pop();
for (const Edge& edge : graph[node.node]) {
visitedMask = node.visitedMask;
if (isSpecialNode[edge.node])
visitedMask |= 1 << (isSpecialNode[edge.node] - 1);
if (dist[edge.node][visitedMask] > dist[node.node][node.visitedMask] + edge.cost) {
dist[edge.node][visitedMask] = dist[node.node][node.visitedMask] + edge.cost;
bfQueue.push({edge.node, visitedMask});
}
}
}
}
int main() {
FILE *fin, *fout;
fin = fopen("ubuntzei.in", "r");
fout = fopen("ubuntzei.out", "w");
int k, i, x, y, c;
fscanf(fin, "%d%d", &noNodes, &noEdges);
fscanf(fin, "%d", &k);
for (i = 0; i < k; ++i) {
fscanf(fin, "%d", &x);
addSpecialNode(x - 1);
}
for (i = 0; i < noEdges; ++i) {
fscanf(fin, "%d%d%d", &x, &y, &c);
addEdge(x - 1, y - 1, c);
}
bf({0, 0});
fprintf(fout, "%d\n", dist[noNodes - 1][(1 << noSpecialNodes) - 1]);
fclose(fin);
fclose(fout);
return 0;
}