Cod sursa(job #2115494)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 26 ianuarie 2018 20:14:53
Problema Ubuntzei Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include<bits/stdc++.h>
#define oo 200000000
using namespace std;

int n,m,k;
int dist[20][2005],sol[2005],ans;
int c[20],dp[1<<20][20];

vector < pair <int,int> > G[1005];
int M[22];

void read()
{
    int x,i,y,z;
    freopen("ubuntzei.in","r",stdin);
    scanf("%d %d\n",&n,&m);
    scanf("%d",&k);
    //M.push_back(1);
    for(i=0;i<k;i++)
        scanf("%d",&M[i]);

    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        G[x].push_back(make_pair(y,z));
        G[y].push_back(make_pair(x,z));
    }
}

priority_queue < pair<int,int> > q;
bool viz[1005];

inline void dijkstra(int i,int dist[])
{
    int j,nod;
    memset(viz,0,sizeof(viz));
    for(j=1;j<=n;j++)
        dist[j]=oo;
    dist[i]=0;
    q.push(make_pair(i,0));
    viz[i]=1;
    while(!q.empty())
    {
        nod=q.top().first;
        q.pop();
        vector <pair <int,int> > ::iterator it;
       // if(!viz[nod])
        for(it=G[nod].begin();it!=G[nod].end();it++)
        {
           // if(!viz[(*it).first])
             if(dist[(*it).first]>dist[nod]+(*it).second)
            {
                dist[(*it).first]=dist[nod]+(*it).second;
                q.push(make_pair((*it).first,dist[(*it).first]));
                //viz[(*it).first]=1;
            }
        }
       // viz[nod]=1;

    }

}

void dynamic()
{
    int i,j,cel,les;
        //prima e submultimea vida
        for(i=0;i<(1<<k);i++)
        {
            for(j=0;j<k;j++)
             {
                if(i!=(1<<j)) dp[i][j]=oo;

                if( i>>j & 1 == 1)  //j+1
                {

                    //cout<<j+1<<' ';
                    for(cel=0;cel<k;cel++)
                        if(cel!=j && (i>>cel & 1 ==1))
                    {
                        les=dp[i-(1<<j)][cel]+dist[cel][M[j]];
                        dp[i][j]=min(dp[i][j],les);
                        //cout<<dp[i][j]<<' ';
                    }

             }

             }
        //cout<<endl;

        }
}


int main()
{
    int i;
    read();
    dijkstra(1,sol);
  //cout<<sol[M[0]];
    for(i=0;i<k;i++)
         dijkstra(M[i],dist[i]);

for(i=0;i<k;i++)
    dp[(1<<i)][i]=sol[M[i]];
//cout<<dp[1][0];
    dynamic();

    ans=oo;
    for(i=0;i<k;i++)
       {
          // cout<<dp[(1<<k)-1][i]<<' '<<dist[i][n]<<endl;
        ans=min(ans,dp[(1<<k)-1][i]+dist[i][n]);
       }
    freopen("ubuntzei.out","w",stdout);
    cout<<ans;


}