Cod sursa(job #2935492)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 6 noiembrie 2022 19:34:43
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

const int NMAX = 2000;
const int KMAX = 15;
const int MASK = (1 << KMAX) - 1;
const int INF = 1e9;

int N, M, K;
int C[KMAX + 1];
int idx[NMAX];
vector<pair<int, int>> adj[NMAX];
int dist[NMAX][MASK];
bool inQ[NMAX][MASK];

struct compare {
    bool operator () (const pair<int, int> &a, const pair<int, int> &b) const {
        return dist[a.first][a.second] > dist[b.first][b.second];
    }
};

void dij(int source = 0) {
    fill(dist[0], dist[NMAX], INF);
    priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq;

    dist[source][0] = 0;
    pq.push({source, 0});
    inQ[source][0] = 1;

    while(!pq.empty()) {
        int u = pq.top().first, mask = pq.top().second;
        pq.pop();
        inQ[u][mask] = 0;
//        cout << u << " " << mask << " " << dist[u][mask] << " => ";

        for(const auto &it: adj[u]) {
            if(idx[it.first] != -1) {
                if(dist[it.first][mask | (1 << idx[it.first])] > dist[u][mask] + it.second) {
                    dist[it.first][mask | (1 << idx[it.first])] = dist[u][mask] + it.second;

                    if(!inQ[it.first][mask | (1 << idx[it.first])]) {
//                        cout << it.first << " " << (mask | (1 << idx[it.first])) << " " << dist[it.first][mask | (1 << idx[it.first])] << "; ";
                        pq.push({it.first, mask | (1 << idx[it.first])});
                        inQ[it.first][mask | (1 << idx[it.first])] = 1;
                    }
                }
            } else {
                if(dist[it.first][mask] > dist[u][mask] + it.second) {
                    dist[it.first][mask] = dist[u][mask] + it.second;

                    if(!inQ[it.first][mask]) {
//                        cout << it.first << " " << mask << " " << dist[it.first][mask] << "; ";
                        pq.push({it.first, mask});
                        inQ[it.first][mask] = 1;
                    }
                }
            }
        }
//        cout << '\n';
    }
}

int main() {
    ios_base :: sync_with_stdio(false);

    fin >> N >> M;

    fill(idx, idx + N, -1);

    fin >> K;
    for(int i = 0; i < K; i++) {
        fin >> C[i];
        C[i]--;

        idx[C[i]] = i;
    }

    for(int i = 1; i <= M; i++) {
        int u, v, c;
        fin >> u >> v >> c;
        u--; v--;

        adj[u].push_back({v, c});
        adj[v].push_back({u, c});
    }

    dij();

    fout << dist[N - 1][(1 << K) - 1] << '\n';
    return 0;
}