Cod sursa(job #2490032)

Utilizator Alin_StanciuStanciu Alin Alin_Stanciu Data 9 noiembrie 2019 16:43:07
Problema Ubuntzei Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

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

int n, m, k, l = 0x3f3f3f3f, C[15], D[15][2001];
vector<pair<int, int>> G[2001];

int F[15] = {0};

void Dijkstra(int nod);
void BackPeBiti();

int main()
{
    // citire
    fin >> n >> m >> k;
    for (int i = 0; i < k; ++i)
        fin >> C[i];
    for (int i = 0; i < m; ++i)
    {
        int x, y, z;
        fin >> x >> y >> z;
        G[x].emplace_back(y, z);
        G[y].emplace_back(x, z);
    }

    // fac un Dijkstra din fiecare nod prin care trebuie sa trec
    for (int i = 0; i < k; ++i)
    {
        for (int j = 1; j <= n; ++j)
            D[i][j] = 0x3f3f3f3f;
    }
    for (int i = 0; i < k; ++i)
        Dijkstra(i);
    BackPeBiti(); // toate posibilitatile de ordine a nodurilor obligatorii
    fout << l;

    /*
    for (int i = 0 ; i < k; ++i)
    {
        cout << "D[" << i << "]: ";
        for (int j = 1; j <= n; ++j)
            cout << "{" << j << "," << D[i][j] << "}";
        cout << '\n';
    }
    */

    return 0;
}

void Dijkstra(int iNod)
{
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
    Q.emplace(0, C[iNod]);
    D[iNod][C[iNod]] = 0;
    while (!Q.empty())
    {
        int nod = Q.top().second;
        Q.pop();
        for (pair<int, int> v : G[nod])
        {
            if (D[iNod][nod] + v.second < D[iNod][v.first])
            {
                D[iNod][v.first] = D[iNod][nod] + v.second;
                Q.emplace(v.second, v.first);
            }
        }
    }
}

void Back(int p, int nod, int c)
{
    for (int i = 0; i < k; ++i)
    {
        if (!F[i])
        {
            F[i] = true;
            c += D[i][nod];
            if (p == k)
            {
                if (c + D[i][n] < l)
                    l = c + D[i][n];
            }
            else Back(p + 1, C[i], c);
            F[i] = false;
            c -= D[i][nod];
        }
    }
}

void BackPeBiti()
{
    Back(1, 1, 0);
}