Cod sursa(job #887271)

Utilizator deea101Andreea deea101 Data 23 februarie 2013 17:41:46
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <list>
#define INF (1<<30)
#define nmax 2001
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

vector< pair <int, int> > v[nmax];
list <int> q;
int n,k,dist[16][nmax],dp[1<<16][nmax],p[16];

int main()
{
   int i,j,l,m,x,y,c;
   f>>n>>m>>k;
   for(i=1;i<=k;i++) f>>p[i];
   for(i=0;i<m;i++)
   {
       f>>x>>y>>c;
       v[x].push_back(make_pair(y,c));
       v[y].push_back(make_pair(x,c));
   }
   p[0]=1;
   for(i=0;i<=k;i++)
   {
       dist[i][p[i]]=0;
       q.push_back(p[i]);
       while(!q.empty())
       {
           x=q.front();
           for(j=0;j<v[x].size();j++)
           {
               y=v[x][j].first;
               m=v[x][j].second;
               if(dist[i][x]+m<dist[i][y] || (!dist[i][y] && y!=p[i]))
               {
                   dist[i][y]=dist[i][x]+m;
                   q.push_back(y);
               }
           }
           q.pop_front();
       }
   }
   if(!k) g<<dist[0][n];

   for(i=1;i<(1<<k);i++)
        for(j=0;j<k;j++) dp[i][j+1]=INF;

   for(i=1;i<(1<<k);i++)
   {
        for(j=0;j<k;j++)
        {
            if((1<<j)&i)
            {
                if((1<<j)==i)
                    dp[i][j+1]=dist[0][p[j+1]];
                else
                    for(l=0;l<k;l++)
                    {
                        if(((1<<l)&i) && l!=j)
                            if(dp[i-(1<<j)][l+1]+dist[j+1][p[l+1]]<dp[i][j+1])
                                dp[i][j+1]=dp[i-(1<<j)][l+1]+dist[j+1][p[l+1]];
                    }
            }
        }
   }

    int sol=(1<<30);
    for(i=1;i<=k;i++)
    {
       if(dp[(1<<k)-1][i]+dist[i][n]<sol)
        sol=dp[(1<<k)-1][i]+dist[i][n];
    }
    g<<sol;
}