Cod sursa(job #2726277)

Utilizator Florinos123Gaina Florin Florinos123 Data 20 martie 2021 16:34:57
Problema Ubuntzei Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>

using namespace std;

ifstream f ("ubuntzei.in");
ofstream g ("ubuntzei.out");

int n, m, k, rez;

const int inf = 1e9;

int d[2005], v[2005];

bool used[2005], inq[2005];

int dp[2005][2005], sol[2005];

queue < int > q;

vector < pair < int, int > > graf[2005];

void BellmanFord (int start)
{
    for (int i=1; i<=n; i++)
        d[i] = inf;

    d[start] = 0; inq[start] = 1;
    q.push(start);

    while (!q.empty())
    {
        int nod = q.front();
        q.pop(); inq[nod] = 0;

        for (int i=0; i<graf[nod].size(); i++)
        {
            int vecin = graf[nod][i].first;
            int cost = graf[nod][i].second;

            if (d[nod] + cost < d[vecin])
            {
                d[vecin] = d[nod] + cost;

                if (!inq[vecin])
                {
                    q.push(vecin);
                    inq[vecin] = 1;
                }
            }
        }
    }
}

void Eval ()
{
    int sum = 0;
    for (int i=1; i<k; i++)
    {
        int nod = v[sol[i]];
        int vecin = v[sol[i+1]];
        sum += dp[nod][vecin];
    }

    sum += dp[1][v[sol[1]]];
    sum += dp[v[sol[k]]][n];
    rez = min(rez, sum);
}

void Bkt (int niv)
{
    for (int i=1; i<=k; i++)
    {
        if (!used[i])
        {
            sol[niv] = i;
            used[i] = 1;

            if (niv == k) Eval();
            else Bkt(niv + 1);
            used[i] = 0;
        }
    }
}

int main()
{
    f >> n >> m >> k;
    for (int i=1; i<=k; i++)
        f >> v[i];

    for (int i=1; i<=m; i++)
    {
        int x, y, c;
        f >> x >> y >> c;
        graf[x].push_back(make_pair(y, c));
        graf[y].push_back(make_pair(x, c));
        dp[x][y] = dp[y][x] = c;
    }

    if (k == 0)
    {
        BellmanFord(1);
        g << d[n];
    }
    else
    {
        for (int i=1; i<=n; i++)
        {
            for (int j=1; j<=n; j++)
            {
                if (i != j && !dp[i][j])
                   dp[i][j] = inf;
            }
        }

        for (int t=1; t<=n; t++)
        {
            for (int i=1; i<=n; i++)
            {
                for (int j=1; j<=n; j++)
                {
                    if (i != j && dp[i][t] && dp[t][j])
                        dp[i][j] = min(dp[i][j], dp[i][t] + dp[t][j]);
                }
            }
        }

        sort(v+1, v+k+1);
        rez = inf; Bkt(1);
        g << rez;
    }
    return 0;
}