Cod sursa(job #887282)

Utilizator deea101Andreea deea101 Data 23 februarie 2013 17:45:05
Problema Ubuntzei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 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][16],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];
   else
   {
        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;
   }
}