Cod sursa(job #2936139)

Utilizator vladburacBurac Vlad vladburac Data 8 noiembrie 2022 10:18:04
Problema Ubuntzei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2000;
const int INF = 1e9;
const int KMAX = 15;

ifstream fin( "ubuntzei.in" );
ofstream fout( "ubuntzei.out" );

vector <pair<int, int>> edges[MAXN];
int dp[MAXN][1<<KMAX];
int nodes[KMAX];
int indexx[MAXN];
bool isSpecial[MAXN];
int main() {
  int n, m, i, a, b, cost, mask, k, node;
  fin >> n >> m;
  fin >> k;
  for( i = 0; i < k; i++ ) {
    fin >> nodes[i];
    isSpecial[nodes[i]] = true;
  }
  sort( nodes, nodes + k );
  for( i = 0; i < k; i++ )
    indexx[nodes[i]] = i;
  for( i = 0; i < m; i++ ) {
    fin >> a >> b >> cost;
    a--;
    b--;
    edges[a].push_back( { b, cost } );
    edges[b].push_back( { a, cost } );
  }
  for( mask = 0; mask < ( 1 << KMAX ); mask++ ) {
    for( i = 0; i < n; i++ )
      dp[i][mask] = INF;
  }
  dp[0][0] = 1;
  for( mask = 1; mask < ( 1 << KMAX ); mask++ ) {
    for( i = 0; i < n; i++ ) {
      if( !isSpecial[i] || ( isSpecial[i] && ( mask & ( 1 << indexx[i] ) ) ) ) {
        for( auto j: edges[i] ) {
          node = j.first;
          cost = j.second;
          if( isSpecial[node] && ( mask & ( 1 << indexx[node] ) ) )
            dp[node][mask] = min( dp[node][mask], dp[i][mask-(1<<indexx[node])] + cost );
          else if( !isSpecial[node] )
            dp[node][mask] = min( dp[node][mask], dp[i][mask] + cost );
        }
      }
    }
  }
  fout << dp[n-1][(1<<k)-1];
  return 0;
}