Cod sursa(job #2703886)

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

using namespace std;

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

int n, m, k;

int c[505][505];

bool a[505][505];

long long rez = 2e9;

const int inf = 0x3F3F3F3F;

vector < int > v;

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

    memset(c, inf, sizeof(c));

    for (int i=1; i<=n; i++)
        c[i][i] = 0;

    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 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];
          }

     sort(v.begin(), v.end());
     do
     {
         long long suma = c[1][v[0]] + c[v[v.size()-1]][n];

         for (int i=0; i<v.size()-1; i++)
            suma += c[v[i]][v[i+1]];

         rez = min(rez, suma);

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

     if (k == 0) g << c[1][n];
     else g << rez;

    return 0;
}