Cod sursa(job #2561725)

Utilizator AndreiJJIordan Andrei AndreiJJ Data 29 februarie 2020 09:36:50
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <bitset>

using namespace std;

const int N = 2005, oo = 1e9 + 5;
typedef pair <int, int> pii;

int dist[20][20], C[20], d[N], st[20], n, k, W, sol;
vector <pii> L[N];
priority_queue <pii, vector<pii>, greater<pii> > q;
bitset <20> seen;

void Read ()
{
    ifstream fin ("ubuntzei.in");
    int m;
    fin >> n >> m;
    fin >> k;
    for (int i = 1; i <= k; i++)
    {
        fin >> C[i];
        W = W ^ i;
    }
    while (m--)
    {
        int x, y, c;
        fin >> x >> y >> c;
        L[x].push_back({y, c});
        L[y].push_back({x, c});
    }
}

void Dijkstra (int vertex)
{
    for (int i = 1; i <= n; i++)
        d[i] = oo;
    q.push({0, vertex});
    d[vertex] = 0;
    while (!q.empty())
    {
        int currvertex = q.top().second;
        q.pop();
        for (auto next : L[currvertex])
        {
            if (d[next.first] > d[currvertex] + next.second)
            {
                d[next.first] = d[currvertex] + next.second;
                q.push({d[next.first], next.first});
            }
        }
    }
}

void BuildMatrix ()
{
    for (int i = 1; i <= k; i++)
    {
        Dijkstra(C[i]);
        dist[0][i] = dist[i][0] = d[1];
        dist[k + 1][i] = dist[i][k + 1] = d[n];
        for (int j = 1; j <= k; j++)
            dist[i][j] = d[C[j]];
    }
}

void Compute ()
{
    int cost = 0;
    st[k] = W;
    for (int i = 1; i <= k; i++)
        cost += dist[st[i - 1]][st[i]];
    cost += dist[st[k]][k + 1];
    sol = min (sol, cost);
}

void Back (int top)
{
    if (top == k) Compute();
    else for (int i = 1; i <= k; i++)
        if (!seen[i])
        {
            st[top] = i;
            W ^= i;
            seen[i] = 1;
            Back(top + 1);
            seen[i] = 0;
            W ^= i;
        }
}

int main()
{
    Read();
    BuildMatrix();
    sol = oo;
    Back(1);
    ofstream fout ("ubuntzei.out");
    fout << sol << "\n";
    fout.close();
    return 0;
}