Cod sursa(job #2324685)

Utilizator papinub2Papa Valentin papinub2 Data 21 ianuarie 2019 12:36:03
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define inf 1000000000

using namespace std;

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

bool verif (int cnt, int x, vector<int>&q)
{
    for (int i = 1; i <= cnt; i++)
        if (q[i] == x)
            return false;
    return true;
}

void aranjamente (int nr, int lim, int n, int&sol, vector<int>&v, vector<int>&q, vector<vector<int> >&drum)
{
    if (nr == lim + 1)
    {
        int rez = drum[1][v[q[1]]];
        for (int i = 1; i < lim; i++)
            rez = rez + drum[v[q[i]]][v[q[i + 1]]];
        rez = rez + drum[v[q[lim]]][n];
        sol = min(sol, rez);
        return;
    }

    for (int i = 1; i <= lim; i++)
    {
        q[nr] = i;
        if (verif(nr - 1, i, q))
            aranjamente(nr + 1, lim, n, sol, v, q, drum);
    }
}

int main()
{
    int n, m, k, nr = 1, sol = inf;

    in.sync_with_stdio(false);
    in >> n >> m >> k;

    vector<int> v(k + 1);
    vector<int> q(k + 1);
    vector<vector<int> > drum(n + 1, vector<int>(n + 1));

    for (int i = 1; i <= k; i++)
        in >> v[i];

    for (int i = 1; i <= n; i++)
        for (int j = i + 1; j <= n; j++)
            drum[i][j] = drum[j][i] = inf;

    for (int i = 1; i <= m; i++)
    {
        int x, y, c;
        in >> x >> y >> c;

        drum[x][y] = c;
        drum[y][x] = c;
    }

    for (int w = 1; w <= n; w++)
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
            {
                if (i == j || drum[i][w] == 0 || drum[j][w] == 0)
                    continue;

                drum[i][j] = min(drum[i][j], drum[i][w] + drum[w][j]);
            }

    aranjamente(nr, k, n, sol, v, q, drum);

    out << sol;
    return 0;
}