Cod sursa(job #2561710)

Utilizator ioanaa_ghGhiorghi Ioana-Cristina ioanaa_gh Data 29 februarie 2020 09:24:08
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>
#define oo 1e9 + 1

using namespace std;

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

vector < pair < int, int > > L[2001];
int n, k;
int a[20][20];
int d[2001];
int dp[18][(1 << 16) + 2];
int K[20]; ///cele k noduri
priority_queue < pair < int, int > > Q;
                    ///dist, nod

void Citire()
{
    int i, x, y, m, c;
    fin >> n >> m;
    fin >> k;
    for(i = 1; i <= k; i++)
        fin >> K[i];
    for(i = 1; i <= m; i++)
    {
        fin >> x >> y >> c;
        L[x].push_back({y, c});
        L[y].push_back({x, c});
    }
    fin.close();
}

void Dijkstra(int s)
{
    int nod, i;
    Q.push({0, s});
    for(i = 1; i <= n; i++)
        d[i] = oo;
    d[s] = 0;
    while(!Q.empty())
    {
        nod = Q.top().second;
        Q.pop();
        for(auto w : L[nod])
            if(d[w.first] > d[nod] + w.second)
        {
            d[w.first] = d[nod] + w.second;
            Q.push({-d[w.first], w.first});
        }
    }
}

void CMat()
{
    int i, j;
    for(i = 1; i <= k; i++)
    {
        Dijkstra(K[i]);
        for(j = 1; j <= k; j++)
            a[i][j] = d[K[j]];
        a[0][i] = a[i][0] = d[1];
        a[k + 1][i] = a[i][k + 1] = d[n];
    }
}

void Dinamica()
{
    int i, j, D, p, M, x;
    D = (1 << (k + 1)) - 2;
    M = oo;
    for(i = 0; i <= k + 1; i++)
        for(j = 0; j < D; j++)
            dp[i][j] = oo;
    dp[0][0] = 0;
    for(i = 1; i <= k; i++)
        dp[i][1 << i] = a[0][i];
    if(k == 1)
    {
        for(i = 1; i <= k; i++)
            M = min(M, dp[i][1 << i] + a[1][k + 1]);
    }
    for(j = 1; j <= D; j++)
        for(i = 1; i <= k; i++)
            if(j & (1 << i))
                for(p = 1; p <= k; p++)
                    if((j & (1 << p)) == 0)
                    {
                        x = (j | (1 << p));
                        dp[p][x] = min(dp[p][x], dp[i][j] + a[i][p]);
                        if(x == D)
                            M = min(M, dp[p][x] + a[p][k + 1]);
                    }
    fout << M << "\n";
}

int main()
{
    Citire();
    CMat();
    Dinamica();
    return 0;
}