Cod sursa(job #3309142)

Utilizator iccjocIoan CHELARU iccjoc Data 1 septembrie 2025 19:47:27
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.58 kb
#include <bits/stdc++.h>
using namespace std;

int n;
vector<vector<int>> dp;
vector<vector<pair<int, int>>> g1, g2;
vector<int> dijkstra(int source)
{
    priority_queue<pair<int, int>> p;
    const int INF = 2e9;
    vector<int> dist(n + 1, INF);
    p.push({-0, source});
    dist[source] = 0;
    while(!p.empty())
    {
        int c = -p.top().first;
        int k = p.top().second;
        p.pop();
        if(c != dist[k])
            continue;
        for(auto it = g1[k].begin(); it != g1[k].end(); it++)
        {
            if(dist[(*it).first] > dist[k] + (*it).second)
            {
                dist[(*it).first] = dist[k] + (*it).second;
                p.push({-dist[(*it).first], (*it).first});
            }
        }
    }
    return dist;
}
int main()
{
    freopen("ubuntzei.in", "r", stdin);
    freopen("ubuntzei.out", "w", stdout);
    cin.tie(nullptr)->sync_with_stdio(false);
    int m;
    cin >> n >> m;
    g1.resize(n + 1);
    int k;
    cin >> k;
    g2.resize(k + 3);
    dp.resize(1 << k, vector<int>(k, 1e9));
    vector<int> v;
    for(int i = 0; i < k; i++)
    {
        int x;
        cin >> x;
        v.push_back(x);
    }
    for(int i = 0; i < m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        g1[x].push_back({y, z});
        g1[y].push_back({x, z});
    }
    vector<int> di = dijkstra(1);
    for(auto it = v.begin(); it != v.end(); ++it)
    {
        g2[1].push_back({*it, di[*it]});
    }
    g2[1].push_back({n, di[n]});
    for(auto it = v.begin(); it != v.end(); ++it)
    {
        vector<int> d = dijkstra(*it);
        g2[it - v.begin() + 2].push_back({1, d[1]});
        for(auto jt = v.begin(); jt != v.end(); ++jt)
        {
            if(it != jt)
            {
                g2[it - v.begin() + 2].push_back({*jt, d[*jt]});
            }
        }
        g2[it - v.begin() + 2].push_back({n, d[n]});
    }
    di = dijkstra(n);
    g2[k + 2].push_back({1, di[1]});
    for(auto it = v.begin(); it != v.end(); ++it)
    {
        g2[k + 2].push_back({*it, di[*it]});
    }
    for(int i = 0; i < k; i++)
    {
        for(auto it = g2[1].begin(); it != g2[1].end(); ++it)
        {
            if((*it).first == v[i])
            {
                dp[1 << i][i] = (*it).second;
                break;
            }
        }
    }
    for(int msk = 0; msk < (1 << k); msk++)
    {
        for(int u = 0; u < k; u++)
        {
            if(!(msk & (1 << u)) || dp[msk][u] == 1e9) 
                continue;
            for(int w = 0; w < k; w++)
            {
                if(msk & (1 << w)) 
                    continue;
                int ds = 1e9;
                for(auto it = g2[u + 2].begin(); it != g2[u + 2].end(); ++it)
                {
                    if((*it).first == v[w])
                    {
                        ds = (*it).second;
                        break;
                    }
                }
                dp[msk | (1 << w)][w] = min(dp[msk | (1 << w)][w], dp[msk | (1 << w)][u] + ds);
            }
        }
    }
    int ans = 1e9;
    int vis = (1 << k) - 1;
    for(int i = 0; i < k; i++)
    {
        if(dp[vis][i] != 1e9)
        {
            int ds = 1e9;
            for(auto it = g2[i + 2].begin(); it != g2[i + 2].end(); ++it)
            {
                if((*it).first == n)
                {
                    ds = (*it).second;
                    break;
                }
            }
            ans = min(ans, dp[vis][i] + ds);
        }
    }
    cout << ans;
    return 0;
}