Cod sursa(job #1518150)

Utilizator refugiatBoni Daniel Stefan refugiat Data 5 noiembrie 2015 17:23:41
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<iostream>
#include<fstream>
#include<cstring>
#include<vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int NMAX=20;
ifstream si("hamilton.in");
ofstream so("hamilton.out");
vector<int> v[NMAX];
int cost[NMAX][NMAX];
int dp[1<<NMAX][NMAX];
int sol=inf;
int n;
void rez()
{
    int i,j,k,m;
    int N=(1<<n);
    dp[1][0]=0;
    for(i=1;i<N;++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[N-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";
    so<<'\n';
}