Cod sursa(job #3249986)

Utilizator Bolfa_DBolfa Diana Bolfa_D Data 18 octombrie 2024 23:10:23
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
#define NMAX 300100
#define MOD 1000050000
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int dp[NMAX][55], cost[55][55], n, m;
vector<int>v[55];
int hamilton(int mask, int node)
{
    if(dp[mask][node]==-1)
    {
        dp[mask][node]=MOD;
        for(auto i:v[node])
            if(mask&(1<<i))
            {
                if(i==0 && mask!=(1<<node)+1)
                    continue;
                dp[mask][node]=min(dp[mask][node], hamilton(mask^(1<<node), i)+cost[i][node]);
            }
    }
    return dp[mask][node];
}

int x, y, ans;
int main()
{
    fin>>n>>m;
    for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
            cost[i][j]=MOD;
    memset(dp, -1, sizeof(dp));

    for(int i=1;i<=m;++i)
    {
        fin>>x>>y>>cost[x][y];
        v[y].push_back(x);
    }

    dp[1][0]=0;
    ans=MOD;
    for(auto i:v[0])
        ans=min(ans, hamilton((1<<n)-1,i)+cost[i][0]);
    fout<<ans;
    return 0;
}