Cod sursa(job #2949134)

Utilizator Matei_MunteanuMunteanu Matei Ioan Matei_Munteanu Data 29 noiembrie 2022 22:48:26
Problema Ubuntzei Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 kb
#include <bits/stdc++.h>
using namespace std;

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

long long n, m;
long long k;
long long destinatii[20];
long long dist[20][2004];
vector<pair<long long, long long>> adj[2004];
priority_queue<pair<long long, long long>> Q;
long long dp[20][(1 << 15) + 4];
long long rez = LLONG_MAX;

void dijkstra(int sursa, int nod)
{
    dist[sursa][nod] = 0;
    Q.push({0, nod});
    while (!Q.empty())
    {
        int v = Q.top().second;
        long long dist_v = -Q.top().first;
        Q.pop();
        if (dist_v != dist[sursa][v])
        {
            continue;
        }
        for (pair<long long, long long> edge : adj[v])
        {
            long long u = edge.first;
            long long cost = edge.second;
            if (dist[sursa][v] + cost < dist[sursa][u])
            {
                dist[sursa][u] = dist[sursa][v] + cost;
                Q.push({-dist[sursa][u], u});
            }
        }
    }
}

int main()
{
    fin >> n >> m >> k;
    for (int i = 1; i <= k; i++)
    {
        fin >> destinatii[i];
    }
    for (int i = 1; i <= m; i++)
    {
        long long a, b, c;
        fin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    for (int i = 0; i < k; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            dist[i][j] = INT_MAX;
        }
    }
    for (int i = 0; i < k; i++)
    {
        dijkstra(i, destinatii[i + 1]);
    }
    for (int conf = 0; conf < (1 << k); conf++)
    {
        for (int i = 0; i < k; i++)
        {
            dp[i][conf] = INT_MAX;
        }
    }
    for (int i = 0; i < k; i++)
    {
        dp[i][(1 << i)] = dist[i][1];
    }
    for (int conf = 0; conf < (1 << k); conf++)
    {
        for (int i = 0; i < k; i++)
        {
            if (conf & (1 << i))
            {
                for (int j = 0; j < k; j++)
                {
                    if ((i == j) || (conf & (1 << j) == 0))
                    {
                        continue;
                    }
                    dp[i][conf] = min(dp[i][conf], dp[j][conf ^ (1 << i)] + dist[i][destinatii[j + 1]]);
                }
            }
        }
    }
    // for (int conf = 0; conf < (1 << k); conf++)
    // {
    //     cout << conf << ' ';
    //     for (int i = 0; i < k; i++)
    //     {
    //         cout << dp[i][conf] << ' ';
    //     }
    //     cout << '\n';
    // }
    for (int i = 0; i < k; i++)
    {
        rez = min(rez, dp[i][(1 << k) - 1] + dist[i][n]);
    }
    fout << rez;
    return 0;
}