Cod sursa(job #2567213)

Utilizator lucianul31Moisii Lucian lucianul31 Data 3 martie 2020 15:55:21
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

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

#define mp make_pair
#define pb push_back
const int NMAX = 10005, Infinity = 1<<30, KMAX = 18;
typedef pair < int, int > PAIR;
int n, m, K, Dist[NMAX][NMAX], Friends[KMAX], MIN = 1<<30, LIM, DP[KMAX][1 << KMAX];
vector < PAIR > Edge[NMAX];
priority_queue < PAIR > Q;
bitset < NMAX > Seen;

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

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


int main()
{
    Read();
    for(int i = 0; i < K; i++)
        Dijkstra(Friends[i]);
    LIM = (1<<K) -1;
    for(int i = 1; i <= LIM; i++)
        for(int j = 0; j < K; j++)
            DP[j][i] = Infinity;
    for(int i = 0; i < K; i++)
        DP[i][1 << i] = Dist[1][Friends[i]];
    for(int i = 1; i <= LIM ; i++)
        for(int j = 0; j < K ; j++)
            if(i & (1 << j))
                for (int z = 0; z < K; z++)
                    if (!((1<<(z))&i))
                        DP[z][i^(1<<(z))] = min(DP[z][i^(1<<(z))],DP[j][i]+Dist[Friends[j]][Friends[z]]);
    out << DP[K-1][LIM];
    return 0;
}