Cod sursa(job #2298198)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 7 decembrie 2018 18:09:19
Problema Ubuntzei Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 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];
pair <int,int> dp[(1<<(maxk))+5];
vector <int> qu;
int dst[maxn+5];
int n, m, k;

int bellman ( int bg, int ed )
{
  int lo = 0, nod, nn, i;
  for ( i = 0; i < n; i++ )
    dst[i] = inf;

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

  qu.clear();
  return dst[ed];
}

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

  fin >> n >> m >> k;

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

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

  dp[0] = {0,0};
  for ( i = 1; i < (1<<k); i++ )
    dp[i] = {inf,0}; /// distanta de la 0, ult oras

  int conf, conn, newd;
  for ( conf = 0; conf < (1<<k); conf++ )
    for ( i = 0; i < n; i++ )
      if ( (conf & (1<<i)) == 0 )
      {
        conn = conf + (1<<i);
        newd = dp[conf].first + bellman ( dp[conf].second, wp[i] );
        if ( dp[conn].first > newd )
        {
          dp[conn].first = newd;
          dp[conn].second = i;
        }
      }

  fout << dp[(1<<k)-1].first + bellman ( dp[(1<<k)-1].second, n - 1 );

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

  return 0;
}