Cod sursa(job #2730853)

Utilizator beingsebiPopa Sebastian beingsebi Data 26 martie 2021 22:39:03
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
struct Pair
{
    int dist, nod;

    bool operator<(const Pair &p) const
    {
        return dist > p.dist;
    }
};

const int Inf = 0x3f3f3f3f;

int n, m, K, sol = Inf;
vector<vector<int>> D, dp;
vector<vector<pair<int, int>>> G;
vector<int> C, d;

void Read();
void Dijkstra(int S, vector<int> &d);
int main()
{
    Read();
    Dijkstra(1, d);
    if (K == 0)
    {
        fout << d[n] << '\n';
        return 0;
    }
    for (int i = 0; i < K; ++i)
        Dijkstra(C[i], D[i]);
    for (int j = 0; j < K; ++j)
        dp[1 << j][j] = d[C[j]];
    for (int i = 1; i < (1 << K); ++i)
        for (int j = 0; j < K; ++j)
            if (i & (1 << j))
                for (int k = 0; k < K; ++k)
                    if (!(i & (1 << k)))
                        dp[i | (1 << k)][k] = min(dp[i | (1 << k)][k], dp[i][j] + D[j][C[k]]);
    for (int i = 0; i < K; ++i)
        sol = min(sol, dp[(1 << K) - 1][i] + D[i][n]);
    fout << sol << '\n';
    return 0;
}
void Read()
{
    fin >> n >> m >> K;
    G = vector<vector<pair<int, int>>>(n + 1);
    C = vector<int>(K);
    D = vector<vector<int>>(K);
    dp = vector<vector<int>>(1 << K, vector<int>(K, Inf));

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

    for (int i = 1, x, y, w; i <= m; ++i)
    {
        fin >> x >> y >> w;
        G[x].push_back({y, w});
        G[y].push_back({x, w});
    }
    fin.close();
}

void Dijkstra(int S, vector<int> &d)
{
    priority_queue<Pair> Q;
    d = vector<int>(n + 1, Inf);
    d[S] = 0;
    Q.push({0, S});
    int x, y, z, dx;
    while (!Q.empty())
    {
        x = Q.top().nod;
        dx = Q.top().dist;
        Q.pop();
        if (d[x] < dx)
            continue;
        for (auto w : G[x])
        {
            y = w.first;
            z = w.second;
            if (d[x] + z < d[y])
            {
                d[y] = d[x] + z;
                Q.push({d[y], y});
            }
        }
    }
}