Cod sursa(job #1792407)

Utilizator stefzahZaharia Stefan Tudor stefzah Data 30 octombrie 2016 13:54:56
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n,m,k,q[20],K,x,y,j,C[100000][20],i,aux,d[2005][2005],g[2005],c,sol;
struct NNND{int nod,val;}p;
vector<NNND>v[2005];
queue<int>C1;
int main()
{fin>>n>>m;
 fin>>K;
 for(i=1;i<=K;i++)
    {fin>>q[i];
     q[i]--;
    }
 for(i=1;i<=m;i++)
    {fin>>x>>p.nod>>p.val;
     p.nod--;
     x--;
     v[x].push_back(p);
     g[x]++;
     aux=x;
     x=p.nod;
     p.nod=aux;
     v[x].push_back(p);
     g[x]++;
    }
 for(i=0;i<n;i++)
    {for(j=0;j<n;j++)
        {d[i][j]=1000000000;
         d[j][i]=1000000000;
        }
    }
 for(i=0;i<n;i++)
    d[i][i]=0;
 q[0]=0;
 q[K+1]=n-1;
 K++;
 for(k=0;k<=K;k++)
    {C1.push(q[k]);//fout<<"\n\n";
     while(C1.empty()==0)
      {c=C1.front();
       C1.pop();//fout<<"\n"<<c<<" | ";
       for(i=0;i<g[c];i++)
          {//fout<<v[c][i].nod<<" ";
           if(d[q[k]][v[c][i].nod]>d[q[k]][c]+v[c][i].val){d[q[k]][v[c][i].nod]=d[q[k]][c]+v[c][i].val;
                                                     //fout<<"* "<<d[q[k]][v[c][i].nod]<<"   ";
                                                     C1.push(v[c][i].nod);
                                                    }
          }
      }
    }
    for(i=0;i<(1<<(K));i++)
       for(j=0;j<=K+1;j++)
          C[i][q[j]]=1000000000;
    C[1][0]=0;
 for(i=0;i<(1<<(K));i++)
    {//fout<<"\n"<<i<<"\n";
     for(j=0;j<=K;j++)
        {if(i&(1<<j))
           {for(k=0;k<=K;k++)
               {if(k!=j&&(i&(1<<k))){C[i][j]=min(C[i][j],C[i-(1<<j)][k]+d[q[k]][q[j]]);
                                    // fout<<C[i][j]<<" ";
                                    }
               }
           }
        }
    }
    sol=1000000001;
//fout<<"\n"<<C[1<<(K+1)-1][2];
for(k=0;k<=K-1;k++)
               {sol=min(sol,C[(1<<K)-1][k]+d[q[k]][n-1]);
               }
               fout<<sol;
}