Cod sursa(job #2100899)

Utilizator MoleRatFuia Mihai MoleRat Data 6 ianuarie 2018 15:41:51
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <fstream>
#include <iostream>
#include <set>
#include <vector>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m;
int k,C[20];
int Dist[10005];
int DistP[16][10005];
int D[1<<15+100][15];
vector <pair<int,int> > A[10005];
set <pair<int,int> > S;

inline int vb(int x, int nr)
{
    return (x & (1<<nr)) != 0;
}
void Dj(int start,int Dest[])
{
    for (int i=1; i<=n; i++)
        Dest[i]=999999999;
    Dest[start]=0;
    S.clear();
    for (int i=1; i<=n; i++)
        S.insert(make_pair(Dest[i],i));
    for (int i=1; i<=n; i++)
    {
        pair<int,int> cr;
        cr=*S.begin();
        S.erase(S.begin());
        int poz=cr.second;
        if (Dest[poz]>=cr.first)
        {
            for (vector <pair<int,int> >::iterator it=A[poz].begin(); it!=A[poz].end(); it++)
            {
                if (Dest[it->first]>Dest[poz]+it->second)
                {
                    Dest[it->first]=Dest[poz]+it->second;
                    S.insert(make_pair(Dest[it->first],it->first));
                }
            }
        }
    }
}
int main()
{
    fin>>n>>m;
    fin>>k;
    for (int i=0; i<k; i++)
        fin>>C[i];
    for (int i=1; i<=m; i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        A[x].push_back(make_pair(y,c));
        A[y].push_back(make_pair(x,c));
    }
    Dj(1,Dist);
    if (k==0)
    {
        fout<<Dist[n];
        return 0;
    }
    for (int i=0; i<k; i++)
    {
        Dj(C[i],DistP[i]);
    }
    for (int i=1; i<(1<<k); i++)
    {
        int j=0;
        for (j = 0; j < k; j++)
            if (i == (1<<j))
                break;
        //cout<<i<<' ';
        if (j < k && i == (1<<j))
        {
            D[i][j]=Dist[C[j]];
            continue;
        }
        for (j=0; j<k; j++)
        {
            D[i][j]=999999999;
            if (vb(i,j))
            {
                //cout<<"HYE";
                for (int h = 0; h < k; h++)
                {
                    if (h != j && vb(i, h))
                    {
                        D[i][j] = min(D[i][j], D[i-(1<<j)][h]+DistP[h][C[j]]);
                    }
                }
            }
        }
    }
    int rez = 999999999;
    for (int i = 0; i < k; i++)
    {
        //cout<<D[(1<<k)-1][i]<<' ';
        rez = min(rez, D[(1<<k)-1][i] + DistP[i][n]);
    }
    fout<<rez;
    return 0;
}