Cod sursa(job #2566727)

Utilizator lucianul31Moisii Lucian lucianul31 Data 3 martie 2020 00:24:51
Problema Ubuntzei Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

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

#define mp make_pair
typedef pair < int, int > PAIR;
const int NMAX = 2005, Infinity = 1<<29;
int n, m, K, Friends[16], MIN, N, Dist[20][20], D[NMAX];
priority_queue < PAIR > Q;
vector < PAIR > Edge[NMAX];
bitset < NMAX > Seen;
bitset < 30 > Used;


void BKT(int k, int SUM, int PredFriend)
{
    if(k == K + 1 && SUM + Dist[PredFriend+1][K+1] < MIN)
        MIN = SUM + Dist[PredFriend+1][K+1];
    else
    {
        for(int i=1; i<=K; i++)
            if(!Used[i])
            {
                Used[i] = 1;
                int s = Dist[PredFriend+1][i] + SUM;
                if(s < MIN)
                    BKT(k+1, s, i);
                Used[i] = 0;
            }
    }
}

void Read()
{
    int x, y, c;
    in >> n >> m >> K;
    for(int i = 1; i <= K; i++)
        in >> Friends[i];
    for(int i = 1; i <= m; i++)
        in >> x >> y >> c, Edge[x].push_back(mp(y, c)), Edge[y].push_back(mp(x, c));
}

void Dijkstra(int x)
{
    Q.push(mp(0, x));
    while(!Q.empty())
    {
        x = Q.top().second;
        Q.pop();
        if(!Seen[x])
        {
            for(PAIR it : Edge[x])
                if(D[x] + it.second < D[it.first])
                    D[it.first] = D[x] + it.second, Q.push(mp(-D[it.first], it.first));
            Seen[x] = 1;
        }
    }
}

int main()
{
    Read();
    for(int i = 1; i <= K; i++)
    {
        for(int j = 1; j <=n; j++)
            D[j] = Infinity, Seen[j] = 0;
        D[Friends[i]] = 0;
        Dijkstra(Friends[i]);
        Dist[1][i] = D[1];
        K++;
        for(int j = 2; j <= K; j++)
            Dist[j][i] = D[Friends[j-1]];
        K--;
        Dist[i+1][i] = Infinity;
    }
    for(int j = 1; j <=n; j++)
        D[j] = Infinity, Seen[j] = 0;
    D[n] = 0;
    Dijkstra(n);
    K++;
    Dist[1][K] = D[1];
    for(int i = 2; i<=K; i++)
        Dist[i][K] = D[Friends[i-1]];
    K--;
    MIN = 1<<30;
    if(K == 0)
    {
        out << Dist[1][1];
        return 0;
    }
    for(int i = 1; i <= K; i++)
        Used[i] = 1, BKT(2, Dist[1][i], 1), Used[i] = 0;
    out << MIN;
    return 0;
}