Cod sursa(job #3199830)

Utilizator Alexinfo22Rusu Luca Alexinfo22 Data 2 februarie 2024 18:31:34
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <utility>
#include <climits>
using namespace std;
#define pb(x) push_back(x)
#define fir first
#define sec second
typedef int ll;
typedef pair<ll,ll> pll;
vector<ll> ham(vector<vector<ll>> adi)
{

    vector<ll> rez;
    ll n=adi.size(),pn=(1<<n),msk,i,j,k;
    vector<vector<ll>> dp(pn,vector<ll>(n,1e8));
    for(i=1;i<n;i++)
        dp[1<<i][i]=adi[0][i];
    for(msk=1;msk<pn;msk++)
    {
        for(i=1;i<n;i++)
        {
            if(!((1<<i)&msk))continue;
            for(j=0;j<n;j++)
            {
                if((1<<j)&msk)continue;
                dp[msk+(1<<j)][j]=min(dp[msk+(1<<j)][j],dp[msk][i]+adi[i][j]);
            }
        }
    }
    if(dp[pn-1][0]==1e8)return cout<<"Nu exista solutie",rez;
    cout<<dp[pn-1][0]<<endl;
    return rez;
}
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll n,m,i,j,a,b,c;
    cin>>n>>m;
    vector<vector<ll>> adi(n,vector<ll>(n,1e8));
    for(i=0;i<m;i++)
    {
        cin>>a>>b>>c;
        adi[a][b]=c;
    }
    ham(adi);
	return 0;
}