Cod sursa(job #2341427)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 11 februarie 2019 20:07:26
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include<bits/stdc++.h>

using namespace std;

int n,m,k,c[16],s[2009],dist[2009][2009];

vector<pair<int,int>> v[2009];

priority_queue<pair<int,int>> pq;

int dp[1<<16][16];

void dijkstra(int nod,int d[])
{
    int pos,cst,next,val;
    for(int i=1; i<=n; i++)
    {
        d[i]=1e9;
    }
    d[nod]=0;
    pq.push({0,nod});
    while(!pq.empty())
    {
        pos=pq.top().second;
        cst=pq.top().first;
        pq.pop();
        if(s[pos]==0)
        {
            s[pos]=1;
            for(int i=0; i<v[pos].size(); i++)
            {
                next=v[pos][i].first;
                val=v[pos][i].second;
                if(d[next]>d[pos]+val)
                {
                    d[next]=d[pos]+val;
                    pq.push({-d[next],next});
                }
            }
        }
    }
}



int main()
{
    ifstream fin("ubuntzei.in");
    ofstream fout("ubuntzei.out");
    fin>>n>>m>>k;
    for(int i=1; i<=k; i++)
    {
        fin>>c[i];
    }
    for(int i=1; i<=m; i++)
    {
        int x,y,dist;
        fin>>x>>y>>dist;
        v[x].push_back({y,dist});
        v[y].push_back({x,dist});
    }
    dijkstra(1,dist[1]);
    for(int i=1; i<=k; i++)
    {
        memset(s,0,sizeof(s));
        dijkstra(c[i],dist[c[i]]);
    }
    if(k==0)
    {
        fout<<dist[1][n];
        return 0;
    }
    for(int i=1; i<(1<<k); i++)
    {
        for(int j=1; j<=n; j++)
        {
            dp[i][j]=1e9;
        }
    }
    for(int i=1; i<=k; i++)
    {
        dp[1<<(i-1)][i]=dist[1][c[i]];
    }

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