Cod sursa(job #3357820)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 15:17:03
Problema Ciclu hamiltonian de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

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

const int MAX = (1 << 18);
int gr[20][20];
vector <int> mask [20];
int dp [MAX + 5][20];

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int nodes , edges;
    cin>>nodes>>edges;

    for (int i=1; i<=edges; i++){
        int a , b , val;
        cin>>a>>b>>val;
        gr[a][b] = val;
    }

    for (int masc=0; masc<(1 << nodes); masc++){
        int cont = 0;
        for (int bit = 0; bit < nodes; bit++){
            if (masc & (1 << bit)){
                cont ++;
            }
        }
        mask[cont].push_back(masc);
    }

    for (int i=0; i<=nodes; i++){
        for (int j=0; j<nodes; j++){
            dp[(1 << i)][j] = INT_MAX;
        }
    }
    dp[1][0] = 0;

    for (int i=1; i<=nodes; i++){
        for (auto &x : mask[i]){
            for (int l=0; l<nodes; l++){
                if (dp[x][l] != INT_MAX){
                    for (int bit = 0; bit<nodes; bit++){
                        if ((!(x & (1 << bit))) && gr[l][bit] != 0){
                            if (dp[x + (1 << bit)][bit] > dp[x][l] + gr[l][bit]){
                                dp[x + (1 << bit)][bit] = dp[x][l] + gr[l][bit];
                            }
                        }
                    }
                }
            }
        }
    }

    int MIN = INT_MAX;
    for (int l=0; l<nodes; l++){
        if (dp[(1 << nodes) - 1][l] != INT_MAX && gr[l][0] != 0){
            MIN = min(MIN , dp[(1 << nodes) - 1][l] + gr[l][0]);
        }
    }

    if (MIN == INT_MAX){
        cout<<"Nu exista solutie";
        return 0;
    }
    cout<<MIN;

    return 0;
}