Cod sursa(job #3279963)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 24 februarie 2025 22:03:46
Problema Ubuntzei Scor 55
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#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;
}