Cod sursa(job #2519305)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 7 ianuarie 2020 16:04:16
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <bits/stdc++.h>
#define dim 2007
#define inf 2000000000
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
vector < pair<int,int> > L[dim];
set<pair<int,int> > s;
int n,k,q[dim],m,i,x,y,z,K[20];
int d[17][dim],j,dp[17][(1<<15)+30];
void dijkstra(int dist,int nod,int d[])
{
    int i,vecin,D;
    s.clear();
    s.insert({0,nod});
    for(i=1;i<=n;i++)
        d[i]=inf;
    d[nod]=0;

    while(s.size()>0){
        dist=s.begin()->first;
        nod=s.begin()->second;
        s.erase(s.begin());
        for(i=0;i<L[nod].size();i++){
            vecin=L[nod][i].first;
            D=L[nod][i].second;

        if(d[vecin]>D+dist){
            s.erase({d[vecin],vecin});
            d[vecin]=D+dist;
            s.insert({d[vecin],vecin});
        }
        }
    }
}
int main()
{
    fin>>n>>m>>k;
    for(i=1; i<=k; i++)
    {
        fin>>x;
        K[i]=x;
    }
    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>z;
        L[x].push_back({y,z});
        L[y].push_back({x,z});
    }
    /// distanta nod stare
    dijkstra(0,1,d[0]);
    for(i=1;i<=k;i++){
        dijkstra(0,K[i],d[i]);
    }
    for(i=1;i<=k;i++){
        for(j=0;j<(1<<k);j++)
        dp[i][j]=inf;
       // cout<<K[i]<<endl;
    dp[i][(1<<(i-1))]=d[0][K[i]];
    }
    for(int stare=1;stare<(1<<k);stare++){
        for(int j=1;j<=k;j++){
            if(dp[j][stare]!=inf){
                for(int bit=1;bit<=k;bit++){
                    if((stare>>(bit-1))%2==0){
                        int ns=stare;
                        ns|=(1<<(bit-1));
                        dp[bit][ns]=min(dp[bit][ns],d[j][K[bit]]+dp[j][stare]);
                    }
                }
            }
        }
    }
    int sol=inf;
    for(i=1;i<=k;i++){
        sol=min(sol,dp[i][(1<<k)-1]+d[i][n]);
    }
    if(k==0)
        sol=d[0][n];
    fout<<sol;
}