Cod sursa(job #2713862)

Utilizator sichetpaulSichet Paul sichetpaul Data 28 februarie 2021 19:38:53
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>
#define Nmax 2002
#define INF 1e9
#define Bit (1 << 15) + 2
#define Kmax 17
#define pi pair<int, int>
using namespace std;

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

int N, M, K;
int dp[Bit][Kmax], dist[Nmax][Nmax], v[Kmax];
bool vis[Nmax];
vector<pi> G[Nmax];
priority_queue<pi, vector<pi>, greater<pi> > Q;

void Dijsktra(int x) {
    for (int i = 1; i <= N; ++i)
        vis[i] = 0, dist[x][i] = INF;

    dist[x][x] = 0;
    Q.push({0, x});
    while (!Q.empty()) {
        int node = Q.top().second, len = Q.top().first;
        Q.pop();
        if (vis[node]) continue;
        vis[node] = 1;
        for (auto it: G[node]) {
            int nxt = it.first, len2 = len + it.second;
            if (!vis[nxt] && len2 < dist[x][nxt])
              dist[x][nxt] = len2, Q.push({len2, nxt});
        }
    }
}
int main()
{
    fin >> N >> M >> K;
    for (int i = 0; i < K; ++i)
        fin >> v[i];
    for (int i = 0; i < (1 << K); ++i)
    for (int j = 0; j < K; ++j)
        dp[i][j] = INF;
    for (int i = 1; i <= M; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        G[x].push_back({y, c});
        G[y].push_back({x, c});
    }

    Dijsktra(1);
    if (K == 0) {
        fout << dist[1][N] << " ";
        return 0;
    }
    for (int i = 0; i < K; ++i)
        Dijsktra(v[i]);

    for (int i = 0; i < K; ++i)
        dp[(1 << i)][i] = dist[1][v[i]];

    for (int msk = 1; msk <= (1 << K) - 1; ++msk)
    for (int i = 0; i < K; ++i)
    for (int j = 0; j < K; ++j)
       if (i != j && msk & (1 << i) && msk & (1 << j))
           dp[msk][i] = min(dp[msk][i], dp[msk - (1 << i)][j] + dist[v[j]][v[i]]);

    int ans = INF;
    for (int i = 0; i < K; ++i)
        ans = min(ans, dp[(1 << K) - 1][i] + dist[v[i]][N]);
    fout << ans << '\n';

    return 0;
}