Cod sursa(job #2544670)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 12 februarie 2020 12:44:48
Problema Ciclu hamiltonian de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>

#define pb push_back

const int MAXN = 18;
const int MAXMASK = 1<<18;
const int INF = (1<<31)-1;

using namespace std;

ifstream cin( "hamilton.in" );
ofstream cout( "hamilton.out" );

int n, m;

vector<int> g[MAXN+1];

int weight[MAXN+1][MAXN+1];
int dp[MAXMASK][MAXN+1];

int cost( int mask, int k )
{
  if( dp[mask][k]==INF )
  {
    for( auto it:g[k] )
      if( mask&(1<<it) )
      {
        int c=cost(mask^(1<<it),it);

        if( c+weight[it][k]<dp[mask][k] )
          dp[mask][k]=c+weight[it][k];
      }
  }

  return dp[mask][k];
}

int main()
{
  cin>>n>>m;

  for( int i=1;i<=m;i++ )
  {
    int x, y, w; cin>>x>>y>>w;

    g[y].pb(x);
    weight[x][y]=w;
  }

  for( int j=0;j<(1<<n);j++ )
    for( int i=0;i<n;i++ )
      dp[j][i]=INF;

  for( int i=0;i<n;i++ )
    dp[0][i]=dp[1<<i][i]=0;

  int ans=INF;

  for( auto it:g[0] )
  {
    int c=cost(((1<<n)-1)^(1<<it),it);

    if( c+weight[it][0]<ans )
      ans=c+weight[it][0];
  }
  if( ans==INF )
    cout<<"Nu exista solutie";
  else
    cout<<ans;

  return 0;
}