Cod sursa(job #3041482)

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

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

using namespace std;

#define cin fin
#define cout fout

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

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

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

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