Cod sursa(job #2324694)

Utilizator papinub2Papa Valentin papinub2 Data 21 ianuarie 2019 12:49:09
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define inf 2000000000

using namespace std;

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

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

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

    for (int i = 1; i <= k; i++)
    {
        q[nr] = i;
        if (verif(nr - 1, q))
            aranjamente(nr + 1, k, 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 <= 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 = i + 1; j <= n; j++)
                if (i != j && drum[i][w] && drum[j][w])
                    if (drum[i][j] > drum[i][w] + drum[w][j] || drum[i][j] == 0)
                        drum[i][j] = drum[j][i] = drum[i][w] + drum[w][j];

    if (k == 0)
    {
        out << drum[1][n];
        return 0;
    }

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

    out << sol;
    return 0;
}