Cod sursa(job #2941256)

Utilizator Teodor94Teodor Plop Teodor94 Data 17 noiembrie 2022 13:45:19
Problema Ubuntzei Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#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;
}