Cod sursa(job #2253627)

Utilizator alexilasiAlex Ilasi alexilasi Data 4 octombrie 2018 10:57:13
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <bits/stdc++.h>

#define mp make_pair
#define f first
#define s second

using namespace std;

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

int n,m,k,i,x,y,z,nn,nd,ans,j,l;
int c[20];
int dr[20][2001],dp[1<<15][15];
vector < pair<int,int> > v[2001];
queue < pair<int,int> > q;

void dijkstra(int nod,int sol[])
{
    for(int i=1;i<=n;i++)
        sol[i]=INT_MAX;
    sol[nod]=0;
    q.push(mp(nod,0));
    while(!q.empty())
    {
        pair <int,int> x=q.front();
        q.pop();
        for(int i=0;i<v[x.f].size();i++)
        {
            nn=v[x.f][i].f;
            nd=x.s+v[x.f][i].s;
            if(sol[nn]>nd)
            {
                sol[nn]=nd;
                q.push(mp(nn,nd));
            }
        }
    }
}

int main()
{
    fin>>n>>m>>k;
    for(i=1;i<=k;i++)
        fin>>c[i];
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        v[x].push_back(mp(y,z));
        v[y].push_back(mp(x,z));
    }
    dijkstra(1,dr[0]);
    for(i=1;i<=k;i++)
        dijkstra(c[i],dr[i]);
    if(k==0)
    {
        fout<<dr[0][n]<<'\n';
    }
    for(i=1;i<1<<(k+1);i++)
    {
        for(j=1;j<=k;j++)
            if(i==1<<j)
                break;
        if(j<=k)
        {
            dp[i][j]=dr[0][j];
            continue;
        }
        for(j=1;j<=k;j++)
        {
            dp[i][j]=INT_MAX;
            if(i&(1<<j))
                for(l=1;l<=k;l++)
                    if(l!=j&&(i&(1<<l)))
                    {
                        nd=dp[i-1<<j][k]+dr[k][c[j]];
                        dp[i][j]=min(dp[i][j],nd);
                    }
        }
    }
    ans=INT_MAX;
	for(i=1;i<=k;i++)
		ans=min(ans,dp[(1<<(k+1))-1][i]+dr[i][n]);
    fout<<ans;
    return 0;
}