Cod sursa(job #2703875)

Utilizator Florinos123Gaina Florin Florinos123 Data 9 februarie 2021 13:32:31
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

int n, m, k;

long long rez = 2e9;

bool used[2000];

int c[2001][2001];

bool a[2001][2001];

const int inf = 1000000;

vector < int > v;

int main()
{
    f >> n >> m >> k;
    for (int i=1; i<=k; i++)
    {
        int x; f >> x;
        v.push_back(x);
    }

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

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

    for (int l=1; l<=n; l++)
        for (int i=1; i<=n; i++)
          for (int j=1; j<=n; j++) {
             if (c[i][j] > c[i][l] + c[l][j])
                c[i][j] = c[i][l] + c[l][j];
          }

     do
     {
         long long suma = 0;
         for (int i=0; i<k; i++)
         {
             if (i == 0)
             {
                 suma += c[1][v[i]];
             }
             if (i == k-1)
             {
                 suma += c[v[i]][n];
             }
             if (i > 0 && i < k-1)
             {
                 suma += c[v[i-1]][v[i]];
             }
         }
         rez = min(rez, suma);

     } while (next_permutation(v.begin(), v.end()));

     g << rez;

    return 0;
}