Cod sursa(job #2948820)

Utilizator Matei_MunteanuMunteanu Matei Ioan Matei_Munteanu Data 28 noiembrie 2022 14:48:36
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 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[2004][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)
{
    dist[sursa][sursa] = 0;
    Q.push({0, sursa});
    while (!Q.empty())
    {
        int v = Q.top().second;
        int dist_v = -Q.top().first;
        Q.pop();
        if (dist_v != dist[sursa][v])
        {
            continue;
        }
        for (pair<int, int> edge : adj[v])
        {
            int u = edge.first;
            int 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 = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            dist[i][j] = LLONG_MAX;
        }
    }
    dijkstra(1);
    for (int i = 1; i <= k; i++)
    {
        dijkstra(destinatii[i]);
    }
    for (int i = 0; i < k; i++)
    {
        int dest = destinatii[i + 1];
        dp[i][(1 << i)] = dist[1][dest];
    }
    for (int conf = 0; conf < (1 << k); conf++)
    {
        for (int i = 0; i < k; i++)
        {
            if (conf & (1 << i) == 0)
            {
                continue;
            }
            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[destinatii[i + 1]][destinatii[j + 1]]);
            }
        }
    }
    for (int i = 0; i < k; i++)
    {
        rez = min(rez, dp[i][(1 << k) - 1] + dist[destinatii[i + 1]][n]);
    }
    fout << rez;
    return 0;
}