Cod sursa(job #1578400)

Utilizator EpictetStamatin Cristian Epictet Data 24 ianuarie 2016 11:51:17
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <set>

using namespace std;

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

const int INF = 2000000000;
int n, m, k, K[20], D[2010];
vector < pair < int, int > > V[2010], G[20];
int Cost[20][20], C[(1 << 17) + 10][20];

void Djikstra(int start_nod)
{
    set < pair < int, int > > H;

    memset(D, 127, sizeof(D));
    H.insert( { 0, start_nod } );
    D[start_nod] = 0;

    while (!H.empty())
    {
        pair < int, int > nod = *H.begin();
        H.erase(*H.begin());

        for (vector < pair < int, int > > :: iterator it = V[nod.second].begin(); it != V[nod.second].end(); it ++)
        {
            if (nod.first + it->second < D[it->first])
            {
                H.erase( { D[it->first], it->first } );
                D[it->first] = nod.first + it->second;
                H.insert( { D[it->first], it->first } );
            }
        }
    }
}

int main()
{
    fin >> n >> m >> k;
    for (int i = 1; i <= k; i ++) fin >> K[i];
    for (int i = 1, x, y, c; i <= m; i ++)
    {
        fin >> x >> y >> c;
        V[x].push_back( { y, c } );
        V[y].push_back( { x, c } );
    }

    K[0] = 1;
    K[k + 1] = n;
    for (int i = 0; i <= k + 1; i ++)
    {
        Djikstra(K[i]);
        for (int j = 0; j <= k + 1; j ++)
        {
            Cost[i][j] = D[K[j]];
        }
    }

    k += 2;
    for (int i = 1; i < (1 << k); i ++)
    {
        for (int j = 0; j < k; j ++)
        {
            C[i][j] = INF;
            if (i & (1 << j))
            {
                for (int l = 0; l < k; l ++)
                {
                    if (i & (1 << l))
                    {
                        C[i][j] = min(C[i][j], C[i ^ (1 << j)][l] + Cost[j][l]);
                    }
                }
            }
        }
    }

    int sol = INF;
    for (int i = 0; i < k; i ++)
    {
        sol = min(sol, C[(1 << k) - 1][0] + Cost[i][0]);
    }

    fout << sol << '\n';
    fout.close();
    return 0;
}