Cod sursa(job #2875135)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 21 martie 2022 09:09:23
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("hamilton.in");
ofstream g("hamilton.out");
const int INF=1000000000;
vector <int> v[20];
int memo[300000][20],cost[20][20];
int calc(int x,int y)
{
    if(memo[x][y]==-1)
    {
    memo[x][y]=INF;
    for(int i=0;i<v[y].size();i++)
        if(x&(1<<v[y][i]))
        {
            if(v[y][i]==0 && x!=(1<<y)+1)
                continue;
            memo[x][y]=min(memo[x][y],calc(x^(1<<y),v[y][i])+cost[v[y][i]][y]);
        }
    }
    return memo[x][y];
}
int n,m,i,j,x,y,z,sol;
int main()
{
    f>>n>>m;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            cost[i][j]=INF;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        v[y].push_back(x);
        cost[x][y]=z;
    }
    memset(memo,-1,sizeof(memo));
    memo[1][0]=0;
    sol=INF;
    for(i=0;i<v[0].size();i++)
        sol=min(sol,calc((1<<n)-1,v[0][i])+cost[v[0][i]][0]);
    if(sol==INF)
        g<<"Nu exista solutie";
    else
        g<<sol;
    return 0;
}