Cod sursa(job #2936167)

Utilizator vladburacBurac Vlad vladburac Data 8 noiembrie 2022 11:05:54
Problema Ubuntzei Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2000;
const int INF = 1e18;
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+2];
int k, n;
queue <int> q;
bool marked[MAXN];
int dist[KMAX][KMAX], d[MAXN];

void bf( int node ) {
  int i;
  for( i = 0; i < n; i++ )
    d[i] = INF, marked[i] = false;
  q.push( node );
  d[node] = 0;
  while( !q.empty() ) {
    auto qfront = q.front();
    q.pop();
    marked[qfront] = false;
    for( auto vec: edges[qfront] ) {
      if( d[vec.first] > d[qfront] + vec.second ) {
        d[vec.first] = d[qfront] + vec.second;
        if( !marked[vec.first] ) {
          q.push( vec.first );
          marked[vec.first] = true;
        }
      }
    }
  }
}
void calcDist() {
  int i, j;
  for( i = 0; i < k; i++ ) {
    bf( nodes[i] );
    for( j = 0; j < k; j++ )
      dist[i][j] = d[nodes[j]];
  }
}
signed main() {
  int m, i, a, b, cost, mask, j;
  fin >> n >> m;
  fin >> k;
  nodes[0] = 0;
  for( i = 1; i <= k; i++ ) {
    fin >> nodes[i];
    nodes[i]--;
  }
  nodes[k+1] = n - 1;
  k += 2;
  sort( nodes, nodes + k );
  for( i = 0; i < m; i++ ) {
    fin >> a >> b >> cost;
    a--;
    b--;
    edges[a].push_back( { b, cost } );
    edges[b].push_back( { a, cost } );
  }
  calcDist();
  for( mask = 0; mask < ( 1 << KMAX ); mask++ ) {
    for( i = 0; i < k; i++ )
      dp[i][mask] = INF;
  }
  dp[0][1<<0] = 0;
  for( mask = 1; mask < ( 1 << KMAX ); mask++ ) {
    for( i = 0; i < k; i++ ) {
      if( mask & ( 1 << i ) ) {
        for( j = 0; j < k; j++ ) {
          if( ( mask & ( 1 << j ) ) && i != j )
            dp[j][mask] = min( dp[j][mask], dp[i][mask-(1<<j)] + dist[i][j] );
        }
      }
    }
  }
  fout << dp[k-1][(1<<k)-1];
  return 0;
}