Cod sursa(job #3000496)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 12 martie 2023 15:26:27
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

ifstream fin ("hamilton.in");
ofstream fout ("hamilton.out");

const int NMAX=25;
const int MASK=(1<<21);
const int INF=2e9;

int dp2[NMAX][NMAX];
int dp[MASK][NMAX];

int main()
{
    int n,m,i,j,x,y,cost,mask,mini=INF;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        dp2[x][y]=cost;
    }
    for(i=0;i<(1<<n);i++)
        for(j=0;j<n;j++)
            dp[i][j]=INF;
    dp[0][0]=dp[1][0]=0;
    for(mask=1;mask<(1<<n);mask++)
    {
        for(i=0;i<n;i++)
        {
            if(mask & (1<<i))
            {
                for(j=0;j<n;j++)
                {
                    if(dp2[i][j] && !(mask & (1<<j)))
                        dp[mask^(1<<j)][j]=min(dp[mask^(1<<j)][j],dp[mask][i]+dp2[i][j]);
                }
            }
        }
    }
    for(i=0;i<n;i++)
    {
        if(dp2[i][0])
            mini=min(mini,dp[(1<<n)-1][i]+dp2[i][0]);
    }
    if(mini==INF)
        fout<<"Nu exista solutie";
    else
        fout<<mini;
    return 0;
}