Cod sursa(job #3367032)

Utilizator AlexandruCorneaCornea Alexandru Mihai AlexandruCornea Data 5 octombrie 2026 19:54:07
Problema Ciclu hamiltonian de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");

const int NMAX=18;
const long long INF=4e18;

int n,m;
vector<pair<int,int>> v[NMAX];

long long dp[1<<NMAX][NMAX];

void citire()
{
    fin>>n>>m;

    for(int i=1; i<=m; i++)
    {
        int x,y,c;
        fin>>x>>y>>c;

        v[x].push_back({y,c});
    }
}

void rezolvare()
{
    int total=(1<<n);

    for(int i=0; i<total; i++)
        for(int j=0; j<n; j++)
            dp[i][j]=INF;

    dp[1][0]=0;

    for(int mask=1; mask<total; mask++)
    {
        for(int nod=0; nod<n; nod++)
        {
            if(dp[mask][nod]==INF)
                continue;

            for(auto x:v[nod])
            {
                int vec=x.first;
                int cost=x.second;

                if(mask & (1<<vec))
                    continue;

                int nmask=mask | (1<<vec);

                dp[nmask][vec]=min(dp[nmask][vec],dp[mask][nod]+cost);
            }
        }
    }
}

void afisare()
{
    int mask=(1<<n)-1;
    long long ans=INF;

    for(int i=1; i<n; i++)
    {
        for(auto x:v[i])
        {
            int vec=x.first;
            int cost=x.second;

            if(vec==0)
                ans=min(ans,dp[mask][i]+cost);
        }
    }

    if(ans==INF)
        fout<<"Nu exista solutie";
    else
        fout<<ans;
}

int main()
{
    citire();
    rezolvare();
    afisare();

    return 0;
}