Cod sursa(job #3188203)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 2 ianuarie 2024 13:23:11
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int n,m,mat[20][20],cost[20][20],doi[21],dp[262150][22],verif;
int main()
{
    doi[0]=1;
    for(int i=1;i<=18;i++)
        doi[i]=doi[i-1]*2;
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        mat[x][y]=1;
        fin>>cost[x][y];
    }
    for(int i=1;i<n;i++)
    {
        if(mat[0][i])
            dp[(1<<i)|1][i]=cost[0][i];
    }
    for(int mask=2;mask<=doi[n]-1;mask++)
    {
        for(int y=1;y<n;y++)
            if(mask&(1<<y))
            {
                int mask1=mask^(1<<y);
                int minim=10000000000;
                for(int x=1;x<n;x++)
                {
                    if(mask1&(1<<x))
                    {
                        if(mat[x][y])
                            minim=min(minim,dp[mask1][x]+cost[x][y]);
                    }
                }
                if(dp[mask][y]==0)
                    dp[mask][y]=minim;
            }
    }
    int minim=10000000000;
    for(int i=1;i<n;i++)
    {
        if(mat[i][0] && dp[doi[n]-1][i]!=minim)
        {
           minim=min(minim,dp[doi[n]-1][i]+cost[i][0]);
           verif=1;
        }
    }
    if(verif)
        fout<<minim;
    else
        fout<<"Nu exista solutie";
    return 0;
}