Cod sursa(job #3340366)

Utilizator iEmanuelRob Emanuel iEmanuel Data 13 februarie 2026 21:17:24
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;
const string txt="hamilton";

ifstream fin (txt+".in");
ofstream fout(txt+".out");
#pragma GCC optimize("O3,unroll-loops")
#define cin fin
#define cout fout
#define pii pair<int,int>
#define pb push_back
const int inf=1e9;;
typedef  long long int ll;

const int nmax=19;
int graf[nmax][nmax];
int n,m;
int dp[1<<nmax+1][nmax];
int startnode[1<<nmax+1][nmax];

inline  void read() {
    cin>>n>>m;
    for (int i=0;i<nmax;i++)
        for (int j=0;j<nmax;j++)
            graf[i][j]=inf;

    while (m--) {
        int n1,n2,c;
        cin>>n1>>n2>>c;
        graf[n1][n2]=c;
    }
}

int main() {
    read();
    for (int mask=1;mask<(1<<n);mask++) {
        fill(dp[mask],dp[mask]+nmax,inf);
        if (__builtin_popcount(mask)==1) {
            dp[mask][__builtin_ctz(mask)]=0;
            startnode[mask][__builtin_ctz(mask)]=__builtin_ctz(mask);
        }
        else {
            for (int i=0;i<n;i++) {
                if ((1<<i)&mask) {
                    for (int j=0;j<n;j++) {
                        if (((1<<j)&mask)&&i!=j) {
                            if (dp[mask][i]>dp[mask^(1<<i)][j]+graf[j][i]) {
                                dp[mask][i]=dp[mask^(1<<i)][j]+graf[j][i];
                                startnode[mask][i]=startnode[mask^(1<<i)][j];
                            }
                        }
                    }
                }
            }
        }
    }
    //dp[1<<n] are ciclu
    int sol=inf;
    for (int i=0;i<n;i++) {
        int nodstart=startnode[(1<<n)-1][i];
            sol=min(sol,dp[(1<<n)-1][i]+graf[i][nodstart]);
    }
    if (sol!=inf)
    cout<<sol;
    else cout<<"Nu exista solutie";
}