Cod sursa(job #2127054)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 10 februarie 2018 11:55:51
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int dp[20][1<<17],k,m,n,vPrieteni[20];
int vDist[2005];
priority_queue <pair<int,int> > q;
vector <pair<int,int> > G[2005];
void citire()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=k;i++)
        scanf("%d",&vPrieteni[i]);
    int nod1,nod2,cost;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&nod1,&nod2,&cost);
        G[nod1].push_back(make_pair(nod2,cost));
        G[nod2].push_back(make_pair(nod1,cost));
    }
}
void dij(int nod)
{
    for(int i=1;i<=n;i++)
        {
            vDist[i]=0x3f3f3f3f;
        }
    vDist[nod]=0;
    q.push(make_pair(0,nod));
    while(!q.empty())
    {
        int dist=-q.top().first;
        int nodCurent=q.top().second;
        q.pop();
        for(auto it:G[nodCurent])
        {
            if(vDist[it.first]>vDist[nodCurent]+it.second)
            {
                vDist[it.first]=vDist[nodCurent]+it.second;
                q.push(make_pair(-it.second,it.first));
            }
        }
    }
}
void bitmask()
{
    int mCost[20][20];
    dij(1);
    mCost[0][0]=0;
    for(int i=1;i<=k;i++)
    {
        mCost[0][i]=vDist[vPrieteni[i]];
    }
    mCost[0][k+1]=vDist[n];

    for(int i=1;i<=k;i++)
    {
        dij(vPrieteni[i]);
        mCost[i][0]=vDist[1];
        for(int j=1;j<=k;j++)
            mCost[i][j]=vDist[vPrieteni[j]];
        mCost[i][k+1]=vDist[n];
    }
    for(int i=0;i<=k+1;i++)
        for(int j=1;j<(1<<(k+1));j++)
            dp[i][j]=0x3f3f3f3f;

    for (int i=0; i<k+2; i++)
        dp[i][1<<i]=mCost[i][1];

    for(int j=1;j<(1<<(k+2));j++)
        for(int i=0;i<k+2;i++)
        {
            if(j&(1<<i))
                for(int z=0;z<k+2;z++)
                    if(j&(1<<z))
                    {
                        dp[i][j]=min(dp[i][j],dp[z][j^(1<<i)]+mCost[z][i]);
                    }
        }
    printf("%d",dp[k+1][(1<<k+2)-1]);
}
int main()
{
    freopen("ubuntzei.in","r",stdin);
    freopen("ubuntzei.out","w",stdout);
    citire();
    bitmask();

    return 0;
}