Cod sursa(job #2540591)

Utilizator Leonard123Mirt Leonard Leonard123 Data 7 februarie 2020 12:43:47
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<bits/stdc++.h>
#define maxn 2005
#define inf 1<<30
using namespace std;
queue <int> q;
vector <pair<int,int> > v[maxn];
int n,m,c[maxn],i,x,y,cost,cmb,d[17][17],rez[maxn],sol[(1<<17)][17],k,vec;

ifstream ccin("ubuntzei.in");
ofstream ccout("ubuntzei.out");

void bellman(int x){
  for(int i=1; i<=n; i++)
    rez[i]=inf;
  rez[x]=0;
  q.push(x);
  while(!q.empty()){
    int nod=q.front();
    q.pop();
    for(int i=0; i<v[nod].size(); i++)
      vec=v[nod][i].first, cost=v[nod][i].second;
      if(rez[vec]>rez[nod]+cost)
        rez[vec]=rez[nod]+vec, q.push(vec);
  }
}

int main(){
  ccin>>n>>m;
  ccin>>k;
  for(i=1; i<=k; i++)
    ccin>>c[i];
  while(m--){
    ccin>>x>>y>>cost;
    v[x].push_back(make_pair(y,cost));
    v[y].push_back(make_pair(x,cost));
  }
  if(!k){
    bellman(1);
    ccout<<c[n];
    return 0;
  }
  c[0]=1; c[++k]=n;
  for(i=0; i<=k; i++){
    bellman(c[i]);
      for(int j=0; j<=k; j++)
        d[i][j]=rez[c[j]];
  }
  k--;
  cmb=(1<<k);
  for(i=0; i<=cmb; i++)
    for(int j=0; j<=k; j++)
      sol[i][j]=inf;
  sol[0][0]=0;
  for(int x=1; x<cmb; ++x)
    for(i=0; i<k; ++i)
      if(x&&(1<<i))
        for(int j=0, ex=(x-(1<<i)); j<=k; j++)
          sol[x][i+1]=min(sol[x][i+1], sol[ex][j]+d[y][i+1]);
  int ans=inf;
  for(int i=1; i<=k; i++)
    ans=min(ans,sol[i][cmb-1]+d[i][k+1]);
  ccout<<ans;
  return 0;
}