Cod sursa(job #1917713)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 9 martie 2017 12:53:07
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,i,j,l,x,y,c,nr,sol,v[20],cost[1<<11],GR[1<<11],viz[1<<11],C[22][22],dp[16][1<<15];
vector <pair <int,int> > G[1<<11];
void djk(int ind)
{
    priority_queue <pair <int,int> ,vector <pair <int,int> > ,greater <pair <int,int> > > Q;
    int i,X=v[ind];
    for(i=1;i<=n;++i) cost[i]=1<<30,viz[i]=0;
    Q.push(make_pair(0,X));
    while(!Q.empty())
    {
        int c=Q.top().first;
        int x=Q.top().second;
        Q.pop();
        if(viz[x]) continue;
        viz[x]=1;
        cost[x]=c;
        for(i=0;i<G[x].size();++i)
            if(cost[G[x][i].first]>c+G[x][i].second)
            {
                cost[G[x][i].first]=c+G[x][i].second;
                Q.push(make_pair(c+G[x][i].second,G[x][i].first));
            }
    }
    for(i=0;i<=k;++i)
    {
        C[ind][i]=cost[v[i]];
        if(ind==0&&i!=ind&&i!=k) dp[i][1<<(i-1)]=cost[v[i]];
    }
}
int main()
{
    f>>n>>m>>k;
    for(i=1;i<=k;++i) f>>v[i];
    for(i=1;i<(1<<k);++i)
        for(j=1;j<=k;++j) dp[j][i]=1<<30;
    v[0]=1;
    v[++k]=n;
    while(m--)
    {
        f>>x>>y>>c;
        G[x].push_back(make_pair(y,c));
        G[y].push_back(make_pair(x,c));
    }
    for(i=0;i<=k;++i) djk(i);
    if(k==1)
    {
        g<<C[0][k];
        return 0;
    }
    /// dp nod configuratie
    --k;
    for(l=1;l<(1<<k);++l)
    {
        for(i=1;i<=k;++i)
            if(l&(1<<(i-1)))
        {
            if(dp[i][l]==(1<<30)) continue;
            for(j=1;j<=k;++j)
                if(!(l&(1<<(j-1))))
                    dp[j][l+(1<<(j-1))]=min(dp[j][l+(1<<(j-1))],dp[i][l]+C[i][j]);
        }
    }
    --l;
    sol=1<<30;
    for(i=1;i<=k;++i)
        sol=min(sol,dp[i][l]+C[i][k+1]);
    g<<sol;
    return 0;
}