Cod sursa(job #3267734)

Utilizator luca._.solosluca solos luca._.solos Data 12 ianuarie 2025 10:47:42
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>

using namespace std;

const int nmax=18, inf=1e9;
int dp[1<<nmax][21];//dp[x][y]=costul minim pentru un drum de la 0 pana la nodul y, nodurile viz sunmt reperezntate de x in baza 2
int n, m, a, b, c, ci;
vector <int> v[nmax];
int cost[nmax][nmax];

int main()
{
    ifstream cin("hamilton.in");
    ofstream cout("hamilton.out");

    cin>>n>>m;
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<(1<<n); j++)
        {
            dp[j][i]=inf;
        }
        for(int j=0; j<n; j++)
        {
            cost[i][j]=inf;
        }
    }

    for(int i=0; i<m; i++)
    {
        cin>>a>>b>>c;
        v[b].push_back(a);
        cost[a][b]=c;
    }

    dp[1][0]=0;
    for(int i=1; i<(1<<n); i++)
    {
        for(int j=1; j<n; j++)
        {
            if(!((1<<j)&i)) continue;
            for(auto x:v[j])
            {
                ci=i^(1<<j);
                dp[i][j]=min(dp[i][j], dp[ci][x]+cost[x][j]);
            }
        }
    }
    bool ok=false;
    int ans=inf;
    for(int i=1; i<n; i++)
    {
        if(dp[(1<<n)-1][i]!=inf && cost[i][0]!=inf)
        {
            ok=true;
            ans=min(ans, dp[(1<<n)-1][i]+cost[i][0]);
        }
    }
    if(ok) cout<<ans;
    else cout<<"Nu exista solutie";

    return 0;
}