Cod sursa(job #2767707)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 7 august 2021 15:07:14
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;

int k, orase[2002];
int permutari[2002];
int fv[2002];

struct elem
{
    int nod, cost;
    bool operator < (const elem &other) const
    {
        return cost > other.cost;
    }
};

vector<elem> v[2002];
priority_queue<elem> coada;
int ans[2002][2002];
int sol;

void Dijkstra(int sursa)
{
    for(int i = 1; i <= n; i ++)
        ans[sursa][i] = 1e9;
    ans[sursa][sursa] = 0;
    coada.push({sursa, 0});
    while(!coada.empty())
    {
        int nod = coada.top().nod;
        int cost = coada.top().cost;
        coada.pop();
        if(ans[sursa][nod] != cost)
        {
            continue;
        }
        for(auto it : v[nod])
        {
            if(cost + it.cost < ans[sursa][it.nod])
            {
                ans[sursa][it.nod] = cost + it.cost;
                coada.push({it.nod, cost + it.cost});
            }
        }
    }
}

void validare()
{
    int sum = ans[permutari[1]][1];
    for(int i = 2; i <= k; i ++)
    {
        sum = sum + ans[permutari[i]][permutari[i-1]];
    }
    sum = sum + ans[permutari[k]][n];
    fout << sum << ' ';
}

void bk(int val)
{
    if(val == k + 1)
        validare();
    for(int i = 1; i <= k; i ++)
    {
        if(!fv[orase[i]])
        {
            permutari[val] = orase[i];
            fv[orase[i]] = 1;
            bk(val + 1);
            fv[orase[i]] = 0;
        }
    }
}

int main()
{
    fin >> n >> m;
    fin >> k;
    for(int i = 1; i <= k; i ++)
    {
        fin >> orase[i];
    }
    while(m--)
    {
        int a, b, c;
        fin >> a >> b >> c;
        v[a].push_back({b, c});
        v[b].push_back({a, c});
    }
    for(int i = 1; i <= k; i ++)
    {
        Dijkstra(orase[i]);
    }
    sol = INT_MAX;
    bk(1);
}