Cod sursa(job #2959174)

Utilizator YosifIosif Andrei Stefan Yosif Data 29 decembrie 2022 23:23:38
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<bits/stdc++.h>
using namespace std;

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

typedef long long ll;
const ll inf = 10000000000000000;

int n, m, nr, p[18];
ll dst[18][18], r[(1 << 17)][18];
vector < vector < pair <int, int> > > g(2001);
vector<ll> d(2001);

int main()
{
    fin >> n >> m >> nr;

    int i, j, k;

    k = 0;
    p[k] = 1;

    for (i = 1; i <= nr; i++)
    {
        int x;
        fin >> x;

        p[++k] = x;
    }

    p[++k] = n;

    nr++;

    for (int l = 1; l <= m; l++)
    {
        fin >> i >> j >> k;

        g[i].push_back(make_pair(j, k));
        g[j].push_back(make_pair(i, k));
    }

    for (int l = 0; l < nr; l++)
    {
        queue<int> Q;

        Q.push(p[l]);

        for (i = 1; i <= n; i++)
            d[i] = inf;

        d[p[l]] = 0;


        while (!Q.empty())
        {
            int nod = Q.front();
            Q.pop();

            for (auto i : g[nod])
                if (d[i.first] > d[nod] + i.second)
                {
                    d[i.first] = d[nod] + i.second;
                    Q.push(i.first);
                }
        }

        if (l == 0)
        {
            if (nr == 1)
            {
                fout << d[n];
                return 0;
            }
        }

        for (k = l + 1; k <= nr; k++)
            dst[l][k] = dst[k][l] = d[p[k]];
    }

    for (i = 0; i < (1 << (nr + 1)); i++)
        for (j = 0; j <= nr; j++)
            r[i][j] = inf;

    r[0][0] = 0;

    for (i = 0; i < (1 << (nr + 1)); i++)
        for (j = 0; j <= nr; j++)
            if (i & (1 << j))
                for (k = 0; k <= nr; k++)
                    r[i][j] = min(r[i][j], r[i ^ (1 << j)][k] + dst[k][j]);

    fout << r[((1 << (nr + 1)) - 1)][nr];

    return 0;
}