Cod sursa(job #3254704)

Utilizator darian4444Verniceanu Darian darian4444 Data 8 noiembrie 2024 16:29:13
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;

int N,M,dp[(1 << 20)][20],a,b,c,i,j,bitmask,last,newmask,sol=1000000000;
int A[20][20];
deque< pair<int,int> > dq;
bool found;

int main(){
    cin >> N >> M;

    for (i = 1;i <= M;i++){
        cin >> a >> b >> c;
        A[a][b] = c;
    }

    dq.push_back({1,0});

    while (!dq.empty()){
        bitmask = dq.front().first;
        last = dq.front().second;

        for (int i = 0;i < N;i++){
            if ((bitmask == ((1 << N) - 1)) && A[last][i] != 0 && i == 0){
                sol = min(sol,dp[bitmask][last] + A[last][i]);
                found = 1;
            }

            if ((bitmask & (1 << i)) == 0 && A[last][i] != 0){
                newmask = (bitmask | (1 << i));

                dp[newmask][i] = dp[bitmask][last] + A[last][i];
                
                dq.push_back({newmask,i});
            }
        }
        
        dq.pop_front();
    }

    if (!found)
        cout << "Nu exista solutie";
    else
        cout << sol;
}