Cod sursa(job #2710307)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 22 februarie 2021 12:44:40
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>
#define NMAX 2001
#define KMAX 18
#define INF 1e9
using namespace std;

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

vector <pair <int,int> >adj[NMAX];
vector<int>ub;
int d[KMAX][KMAX],ruta[NMAX],distante[NMAX];
int dp[KMAX][1<<KMAX];
int n,m,k,rez=INF;

void dijkstra(int ind)
{
    for(int i=1;i<=n;i++)
        distante[i]=INF;
    priority_queue < pair <int, int> >pq;
    distante[ub[ind]]=0;
    pq.push({0,ub[ind]});
    while(!pq.empty())
    {
        pair<int, int>u=pq.top();
        pq.pop();
        if(ruta[u.second]!=0 || u.second==1)
            d[ind][ruta[u.second]]=distante[u.second];
        for(vector < pair <int, int> >::iterator it=adj[u.second].begin();it!=adj[u.second].end();it++)
        {
            pair <int, int> v=*it;
            if(distante[v.second]>distante[u.second]+v.first)
            {
                distante[v.second]=distante[u.second]+v.first;
                pq.push({-distante[v.second],v.second});
            }
        }
    }
}

int main()
{
    in>>n>>m>>k;
    ub.push_back(1);
    ruta[1]=0;
    for(int i=1;i<=k;i++){
        int nr;
        in>>nr;
        ruta[nr]=i;
        ub.push_back(nr);
    }
    ub.push_back(n);
    ruta[n]=k+1;
    for(int i=1;i<=m;i++)
    {
        int a,b,cost;
        in>>a>>b>>cost;
        adj[a].push_back({cost,b});
        adj[b].push_back({cost,a});
    }
    for(int i=0;i<=k+1;i++)
        for(int j=0;j<=k+1;j++)
            d[i][j]=INF;
    for(int i=0;i<=k+1;i++)
        dijkstra(i);
    int mask_max=((1 << (k+2))-1);
    for(int i=0;i<=k+1;i++)
        for(int mask=1;mask<=mask_max;mask++)
            dp[i][mask]=INF;
    dp[0][1]=0;
    for(int i=0;i<=k+1;i++)
        for(int j=0;j<=k+1;j++)
            for(int mask=1;mask<=mask_max;mask++)
                if((mask & (1 << j) )==0)
                    dp[j][mask+(1 << j)]=min(dp[i][mask]+d[i][j],dp[j][mask+(1 << j)]);
    if(k==0)
        out<<d[0][k+1];
    else
        out<<dp[k+1][mask_max];
    return 0;
}