Cod sursa(job #1744742)

Utilizator refugiatBoni Daniel Stefan refugiat Data 20 august 2016 12:15:35
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int NMAX=19 ;
ifstream si("hamilton.in");
ofstream so("hamilton.out");
vector<int> v[NMAX];
int cost[NMAX][NMAX];
int dp[(1<<(NMAX-1))+1][NMAX+2];
int sol=inf;
int n;
void rez()
{
    int i,j,k,m;
    int p2=1<<n;
    dp[1][0]=0;
    for(i=1;i<p2;++i)
    {
        for(j=0;j<n;++j)
        {
            if(i&(1<<j))
            {
                m=v[j].size();
                for(k=0;k<m;++k)
                {
                    if(i&(1<<v[j][k]))
                    {
                        dp[i][j]=min(dp[i][j],dp[i^(1<<j)][v[j][k]]+cost[v[j][k]][j]);
                    }
                }
            }
        }
    }
    m=v[0].size();
    for(i=0;i<m;++i)
    {
        sol=min(sol,dp[p2-1][v[0][i]]+cost[v[0][i]][0]);
    }
}
int main()
{
    int m;
    si>>n>>m;
    int i,n1,n2;
    memset(cost,inf,sizeof(cost));
    memset(dp,inf,sizeof(dp));
    for(i=0;i<m;++i)
    {
        si>>n1>>n2;
        v[n2].push_back(n1);
        si>>cost[n1][n2];
    }
    rez();
    if(sol!=inf)
        so<<sol;
    else
        so<<"Nu exista solutie";
    return 0;
}