Cod sursa(job #1927829)

Utilizator Garen456Paun Tudor Garen456 Data 15 martie 2017 16:25:55
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#define inf 2147483643
#define nmax (1<<17)+2
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

vector <int> V[2001];
int k,a[20],d[20][2001],n,m,di[nmax][20];
queue <int> C;
void BFS(int pos)
{ int x,v,c,i;
   x=a[pos];
    d[pos][x]=0;
    C.push(x);
    C.push(0);
    while(!C.empty())
    { v=C.front(); C.pop();
       c=C.front(); C.pop();
        for(i=0;i<V[v].size();i=i+2)
            if( c+V[v][i+1] < d[pos][V[v][i]] )
        { d[pos][V[v][i]]=c+V[v][i+1];
            C.push(V[v][i]);
            C.push(c+V[v][i+1]);
        }
    }

}


int main()
{
    int i,j,x,y,z,ct=0,l;
    fin>>n>>m;
    fin>>k;
    for(i=1;i<=k;++i)
    { fin>>j;
        if(j!=1 && j!=n)
            a[++ct]=j-1;
    }
    a[++ct]=n-1;
    for(i=1;i<=m;++i)
    { fin>>x>>y>>z;
         V[x-1].push_back(y-1); V[x-1].push_back(z);
         V[y-1].push_back(x-1); V[y-1].push_back(z);
    }
    for(i=0;i<=ct;++i)
        for(j=0;j<n;++j)
         d[i][j]=inf;

    for(i=0;i<=ct;++i)
        BFS(i);
   // for(i=0;i<=ct;++i)
    //{ for(j=0;j<n;++j)
    //    fout<<d[i][j]<<" ";
    //    fout<<"\n";
   // }
    for(i=1;i< 1<<(ct+1);++i)
      for(j=0;j<=ct;++j)
        di[i][a[j]]=inf;

    di[1][0]=0;
   // fout<<di[ 1<<(ct+1)-1][n-1]<<"\n";
   for(i=1;i< 1<<(ct+1);++i)
    for(j=0;j<=ct;++j)
       if(i&(1<<j) && di[i][j]!=inf)
   {
      for(l=0;l<=ct;++l)
        if(!(i&(1<<l)) && di[i][j]+d[a[j]][a[l]] < di[i+(1<<l)][a[l]] )
           di[i+(1<<l)][a[l]]=di[i][j]+d[a[j]][a[l]];

   }
   fout<<di[ (1<<(ct+1)) -1 ][n-1];
    return 0;
}