Cod sursa(job #2572033)

Utilizator Leonard123Mirt Leonard Leonard123 Data 5 martie 2020 11:18:39
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
include<bits/stdc++.h>
#define maxn 2005
#define maxk 20
#define inf 1000000000
using namespace std;
int cost[maxn],p[maxk],drum[maxk][maxk],n,m,k,sol[(1<<17)][17];
vector <pair<int,int> > v[maxn];
queue  <int> q;

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

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

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