Cod sursa(job #2302466)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 14 decembrie 2018 17:58:06
Problema Ubuntzei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <bits/stdc++.h>
#define maxn 2000
#define maxm 10000
#define maxk 15
#define inf INT_MAX / 2 - 1

using namespace std;

vector <pair<int,int> > g[maxn+5];
int wp[maxk+5];
int dp[(1<<maxk)+5][maxk+5]; /// conf, ult oras
vector <int> qu;
int dst[maxn+5][maxn+5];
int n, m, k;

void bellman ( int bg )
{
  int lo = 0, nod, nn, i;

  qu.push_back ( bg );
  dst[bg][bg] = 0;
  while ( lo < qu.size() )
  {
    nod = qu[lo++];
    for ( i = 0; i < g[nod].size(); i++ )
    {
      nn = g[nod][i].first;
      if ( dst[bg][nn] > dst[bg][nod] + g[nod][i].second )
      {
        dst[bg][nn] = dst[bg][nod] + g[nod][i].second;
        qu.push_back ( nn );
      }
    }
  }
  qu.clear();
}

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

  fin >> n >> m >> k;

  int i, j;
  for ( i = 0; i < k; i++ )
  {
    fin >> wp[i];
    wp[i]--;
  }

  for ( i = 0; i < n; i++ )
    for ( j = 0; j < n; j++ )
      dst[i][j] = inf;

  int a, b, c;
  for ( i = 0; i < m; i++ )
  {
    fin >> a >> b >> c;
    a--; b--;
    g[a].push_back ( {b, c} );
    g[b].push_back ( {a, c} );
  }

  for ( i = 0; i < k; i++ )
    bellman ( wp[i] );
  bellman ( 0 );
  bellman ( n - 1 );

  int conf, conn;

  for ( conf = 0; conf < (1<<k); conf++ )
    for ( i = 0; i < k; i++ )
      dp[conf][i] = inf;

  for ( i = 0; i < k; i++ )
    dp[1<<i][i] = dst[0][wp[i]];

  for ( conf = 0; conf < (1<<k); conf++ )
    for ( i = 0; i < k; i++ )
      if ( (conf & (1<<i)) == 0 )
      {
        conn = conf + (1<<i);
        for ( j = 0; j < k; j++ )
          if ( conf & (1<<j) )
            dp[conn][i] = min ( dp[conn][i], dp[conf][j] + dst[wp[j]][wp[i]] );
      }

  int _m = inf;
  for ( i = 0; i < k; i++ )
    _m = min ( _m, dp[(1<<k)-1][i] + dst[wp[i]][n-1] );

  if ( k > 0 )
    fout << _m;
  else
    fout << dst[0][n-1];

  fin.close ();
  fout.close ();

  return 0;
}