Cod sursa(job #2726276)

Utilizator Florinos123Gaina Florin Florinos123 Data 20 martie 2021 16:34:12
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");

int n, m, k, rez;

const int inf = 1e9;

int v[2005];

bool used[2005];

int dp[2005][2005], sol[2005];

void Eval ()
{
    int sum = 0;
    for (int i=1; i<k; i++)
    {
        int nod = v[sol[i]];
        int vecin = v[sol[i+1]];
        sum += dp[nod][vecin];
    }

    sum += dp[1][v[sol[1]]];
    sum += dp[v[sol[k]]][n];
    rez = min(rez, sum);
}

void Bkt (int niv)
{
    for (int i=1; i<=k; i++)
    {
        if (!used[i])
        {
            sol[niv] = i;
            used[i] = 1;

            if (niv == k) Eval();
            else Bkt(niv + 1);
            used[i] = 0;
        }
    }
}

int main()
{
    f >> n >> m >> k;
    for (int i=1; i<=k; i++)
        f >> v[i];

    for (int i=1; i<=m; i++)
    {
        int x, y, c;
        f >> x >> y >> c;
        dp[x][y] = dp[y][x] = c;
    }

    for (int i=1; i<=n; i++)
    {
        for (int j=1; j<=n; j++)
        {
            if (i != j && !dp[i][j])
                dp[i][j] = inf;
        }
    }

    for (int t=1; t<=n; t++)
    {
        for (int i=1; i<=n; i++)
        {
            for (int j=1; j<=n; j++)
            {
                if (i != j && dp[i][t] && dp[t][j])
                    dp[i][j] = min(dp[i][j], dp[i][t] + dp[t][j]);
            }
        }
    }

    if (k == 0)
       g << dp[1][n];
    else
    {
       sort(v+1, v+k+1);
       rez = inf; Bkt(1);
       g << rez;
    }
    return 0;
}