Cod sursa(job #2374836)

Utilizator HaesteinnSabau Florin Vlad Haesteinn Data 7 martie 2019 20:44:27
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define NMAX 2005
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k;
vector<int> prieteni;
int dist[NMAX];
vector<pair<int,int> > adj[NMAX];
int drum[16][16];
int drumFinal[16];
int dp[15][36000];
void dijkstra(int s)
{
    bool processed[NMAX]={};
    memset(dist,0x3f,sizeof(dist));
    dist[s]=0;
    priority_queue<pair<int,int> >pq;
    pq.push({0,s});
    while(!pq.empty())
    {
        int v=pq.top().second;
        pq.pop();
        if(processed[v]) continue;
        processed[v]=1;
        for(auto x:adj[v])
        {
            int u=x.first,l=x.second;
            if(dist[v]+l<dist[u])
            {
                dist[u]=dist[v]+l;
                pq.push({-dist[u],u});
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    for(int i=0;i<k;i++)
    {
        int x;
        fin>>x;
        prieteni.push_back(x);
    }
    for(int i=0;i<m;i++)
    {
        int v,u,l;
        fin>>v>>u>>l;
        adj[v].push_back({u,l});
        adj[u].push_back({v,l});
    }
    memset(dp,0x3f,sizeof(dp));
    dijkstra(1);
    for(int i=0;i<k;i++)
        dp[i][(1<<i)]=dist[prieteni[i]];
    for(int i=0;i<k;i++)
    {
        dijkstra(prieteni[i]);
        drumFinal[i]=dist[n];
        for(int j=0;j<k;j++)
            drum[i][j]=dist[j];
    }

    for(int i=1;i<(1<<k);i++)
    {
        if((i&(i-1))==0) continue;
        for(int j=0;j<k;j++)
        {
            if((i&(1<<j))==0) continue;
            int m=(i^(1<<j));
            for(int l=0;l<k;l++)
            {
                if((m&(1<<l))==0) continue;
                dp[j][i]=min(dp[j][i],dp[l][m]+drum[l][j]);
            }
        }
    }
    int ans=0x3f3f3f3f;
    if(k==0) ans=dist[n];
    for(int i=0;i<k;i++)
    {
        ans=min(ans,dp[i][(1<<k)-1]+drumFinal[i]);
    }
    fout<<ans;
    return 0;
}