Cod sursa(job #2854477)

Utilizator NeganAlex Mihalcea Negan Data 21 februarie 2022 14:07:19
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;
const int oo = 1e9;

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

int n, m, k;
int dp[20][(1<<15)];
int dist[2005];
int d[1505][1505];
int viz[2005];
int C[2000];
vector< pair<int, int> >V[2005];
void Dijkstra(int x)
{
    int i, j;
    for(i = 1;i <= n;i++)
            dist[i] = oo;
    dist[x] = 0;
    priority_queue<pair<int, int>>pq;
    pq.push({0, x});
    while(!pq.empty())
    {
        int nod = pq.top().second;
        pq.pop();
        for(auto it : V[nod])
            if(dist[it.first] > dist[nod] + it.second)
            {
                dist[it.first] = dist[nod] + it.second;
                pq.push({-dist[it.first], it.first});
            }
    }
    for(i = 0;i <= k + 1;i++)
       d[x][C[i]] = dist[C[i]];
}
void Citire()
{
    int i, x, y, cost;
    fin >> n >> m >> k;
    for(i = 1;i <= k;i++)
        fin >> C[i];
    C[0] = 1;
    C[k + 1] = n;
    for(i = 1;i <= m;i++)
    {
        fin >> x >> y >> cost;
        V[x].push_back({y, cost});
        V[y].push_back({x, cost});
    }
}

void Solve()
{
    int i, stare, j, masca;
    for(i = 0;i <= k + 1;i++)
        Dijkstra(C[i]);
    int K = (1 << k) - 1;
    for(stare = 0;stare <= K;stare++)
        for(i = 0;i <= k + 1;i++)
            dp[i][stare] = oo;
    for(i = 0;i <= k + 1;i++)
    {
        dp[i][(1 << (i - 1))] = d[1][C[i]];
    }
    for(stare = 0;stare <= K;stare++)
        for(i = 1;i <= k;i++)
            if((stare & (1 << (i - 1))))
                for(j = 1;j <= k;j++)
                    if((stare & (1 << (j - 1))) == 0)
                    {
                        masca = (stare | (1 << (j - 1)));
                        dp[j][masca] = min(dp[j][masca], dp[i][stare] + d[C[j]][C[i]]);
                        cout << dp[j][masca] << " ";
                    }

    int sol = oo;
    for(i = 0;i <= k + 1;i++)
        sol = min(sol, dp[i][K] + d[C[i]][n]);
    fout << sol << "\n";
}

int main()
{
    Citire();
    Solve();
    return 0;
}