Cod sursa(job #3164364)

Utilizator DariusM17Murgoci Darius DariusM17 Data 2 noiembrie 2023 22:33:47
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
using namespace std;
#define FAST ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
#define ll long long
ifstream fin("hamilton.in") ;
ofstream fout("hamilton.out") ;
int dp[1<<18][18],n,m ;
vector <int> g[18] ;
int cost[18][18] ;
int memo(int term,int conf)
{
    if(dp[conf][term]==-1)
    {
        dp[conf][term]=1e9;
        for(int it:g[term])
        {
            if(conf&(1<<it)) dp[conf][term]=min(dp[conf][term],memo(it,conf^(1<<term))+cost[it][term]) ;
        }
    }
    return dp[conf][term] ;
}
int main()
{
    fin>>n>>m ;
    for(int i=0;i<=n;++i)
        for(int j=0;j<=n;++j) cost[i][j]=1e9 ;
    for(int i=1,x,y,val; i<=m; ++i)
    {
        fin>>x>>y>>val ;
        g[y].push_back(x) ;
        cost[x][y]=val ;
    }
    int mn=1e9 ;
    for(int i=0; i<n; ++i)
    {
        memset(dp,-1,sizeof(dp)) ;
        dp[1<<i][i]=0 ;
        for(auto it:g[i]) mn=min(mn,cost[it][i]+memo(it,(1<<n)-1)) ;
    }
    if(mn==1e9) fout<<"Nu exista solutie" ;
    else fout<<mn ;
    return 0;
}