Cod sursa(job #2641611)

Utilizator Iulia14iulia slanina Iulia14 Data 12 august 2020 10:18:46
Problema Gather Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <fstream>
#include <vector>

using namespace std;
ifstream cin ("gather.in");
ofstream cout ("gather.out");
long long dist[20][20][20];
long long dp[1 << 16][16];
long long vc[20];
long long det[20];
long long viz[20];
struct ura{
    long long d, ind;
};
ura coada[755];
struct ura2{
    long long c, x, nrdet;
};
vector <ura2> lista[755];
long long biti[1 << 16];
int main()
{
    int k, n, m, i, j;
    cin >> k >> n >> m;
    det[0] = 1;
    for (i = 1; i <= k; i++)
    {
        cin >> det[i];
        vc[det[i]] = i;
    }
    for (i = 1; i <= m; i++)
    {
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        lista[a].push_back({c, b, d});
        lista[b].push_back({c, a, d});
    }
    for (int tot = 0; tot <= k; tot++)
        for (i = 0; i <= k; i++)
        {
            for (j = 1; j <= k; j++)
            {
                dist[i][j][tot] = 1e17;
            }
            for (j = 1; j <= n; j++)
                viz[j] = 0;
            int inc, sf;
            inc = sf = 1;
            coada[1].ind = det[i];
            dist[i][i][tot] = 0;
            viz[det[i]] = 1;
            while (inc <= sf)
            {
                int d = coada[inc].d;
                int ind = coada[inc].ind;
                for (int h = 0; h < lista[ind].size(); h++)
                {
                    if (viz[lista[ind][h].x] == 0 && lista[ind][h].nrdet >= tot)
                    {
                        viz[lista[ind][h].x] = 1;
                        if (vc[lista[ind][h].x])
                            dist[i][vc[lista[ind][h].x]][tot] = d + lista[ind][h].c;
                        coada[++sf].d = d + lista[ind][h].c;
                        coada[sf].ind = lista[ind][h].x;
                    }
                }
                inc++;
            }
        }

    for (i = 1; i < (1 << (k + 1)); i++)
        for (j = 0; j < k + 1; j++)
            if (i & (1 << j))
            {
                biti[i] = biti[i ^ (1 << j)] + 1;
                j = k + 1;
            }
    for (i = 1; i < (1 << (k + 1)); i++)
        for (j = 0; j <= k; j++)
            dp[i][j] = 1e17;
    for (j = 1; j <= k; j++)
        dp[1 + (1 << j)][j] = dist[0][j][0];
    for (i = 3; i < (1 << (k + 1)); i += 2)
        for (j = 1; j <= k; j++)
            if (i & (1 << j))
                for (int h = 1; h <= k; h++)
                    if (i & (1 << h))
                        dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + dist[k][j][biti[i ^ (1 << j)] - 1] * (biti[i ^ (1 << j)]));
long long    sol = 1e17;
   /* for (i = 3; i < (1 << (k + 1)); i += 2)
    {
        for (j = 1; j <= k; j++)
            cout << dp[i][j] << " ";
        cout << endl;
    }*/
    for (i = 1; i <= k; i++)
        sol = min(sol, dp[(1 << (k + 1)) - 1][i]);
    cout << sol;
    return 0;
}