Cod sursa(job #3314079)

Utilizator tonealexandruTone Alexandru tonealexandru Data 8 octombrie 2025 12:24:14
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
#define int long long

using namespace std;

int cost[25][25];
int dp[(1<<18) + 1][25]; /// <mask, last_nod>
vector<pair<int, int>> adj[100005];

signed main()
{
    ifstream cin("hamilton.in");
    ofstream cout("hamilton.out");
    int n, m, a, b, val;
    cin>>n>>m;

    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cost[i][j] = 1e17;

    for(int i=0; i<m; i++)
    {
        cin>>a>>b>>val;
        cost[a][b] = val;

        adj[a].push_back({b, val});
    }

    for(int msk = 1; msk < (1<<n); msk ++)
        for(int j = 0; j < n; j ++)
            dp[msk][j] = 1e17;

    dp[1][0] = 0;

    for(int msk = 1; msk < (1<<n); msk ++)
    {
        for(int j = 0; j < n; j ++) /// nod
        {
            ///verificam daca nodu j e in mask

            if(msk & (1 << j) != 0)
                for(auto x : adj[j])
                {
                    int nod = x.first;
                    ///verificam ca nodu x sa NU fie in mask
                    if( (msk & (1 << nod)) == 0)
                    {
                        int new_msk = msk | (1 << nod);
                        dp[new_msk][nod] = min(dp[new_msk][nod], dp[msk][j]+ cost[j][nod]);
                    }
                }
        }
    }


    int minn = 1e17;
    for(auto x : adj[0]){
        int nod = x.first;
        if(dp[ (1 << n) - 1 ][nod] + cost[nod][0] < minn)
            minn = dp[ (1 << n) - 1 ][nod] + cost[nod][0];
    }

    if(minn = 1e17)
        cout<<"Nu exista solutie";
    else
        cout<<minn;

    return 0;
}