Cod sursa(job #2634300)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 10 iulie 2020 14:06:52
Problema Ciclu hamiltonian de cost minim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin ("hamilton.in");
ofstream fout ("hamilton.out");
long long n,m,x,y,mask,last,last2,ans,i,j,cost;
long long c[20][20];
long long dp[300005][20];
int main()
{
    fin>>n>>m;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            c[i][j]=1e18;

    while(m)
    {
        m--;
        fin>>x>>y>>cost;
        c[x][y]=min(c[x][y], cost);
    }

    if(n==1)
    {
        fout<<0;
        return 0;
    }

    for(mask=1;mask<(1<<n);mask++)
    {
        for(last=0;last<n;last++)
            dp[mask][last]=1e18;
    }

    dp[1][0]=0;
    for(mask=2;mask<(1<<n);mask++)
    {
        if(mask%2==0)
            continue;
        for(last=1;last<n;last++)
        {
            if(!((mask>>last)&1))
                continue;

            for(last2=0;last2<n;last2++)
            {
                if(last==last2)
                    continue;

                if(!((mask>>last2)&1))
                    continue;

                dp[mask][last]=min(dp[mask][last], dp[mask-(1<<last)][last2]+c[last2][last]);
            }
        }
    }

    ans=1e18;
    for(last=1;last<n;last++)
        ans=min(dp[(1<<n)-1][last]+c[last][0], ans);

    fout<<ans;
    return 0;
}