Cod sursa(job #2774164)

Utilizator roberttrutaTruta Robert roberttruta Data 9 septembrie 2021 23:06:10
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>

using namespace std;

ifstream f("hamilton.in");
ofstream g("hamilton.out");

const int inf=1000000000;
int n,m,i,x,y,c,j,t,xr,ans;
int graf[20][20],pow[20],d[263000][20];

int main()
{
    for(i=0;i<20;i++)
        for(j=0;j<20;j++)
        graf[i][j]=inf;
    for(i=0;i<263000;i++)
        for(j=0;j<20;j++)
            d[i][j]=inf;

    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        graf[x][y]=c;
    }
    pow[0]=1;
    for(i=1;i<=19;i++)
        pow[i]=pow[i-1]*2;


    for(i=0;i<n;i++)
        d[pow[i]][i]=0;//drumul de la un nod la el insusi e 0
    for(i=1;i<pow[n];i++)
    {
        for(j=1;j<n;j++)//incepem de la 1 pentru ca stabilim pe "0" ca fiind nodul de start
            if(i&pow[j])//nu are sens sa sa termine in "j" daca nu il contine pe "j"
        {
            xr=i^pow[j];
            for(t=0;t<n;t++)
                if( (xr&pow[t]) && (d[xr][t]+graf[t][j]<d[i][j]) )
                {
                    d[i][j]=d[xr][t]+graf[t][j];
                }
        }
    }
    ans=inf;
    for(i=0;i<n;i++)
    {
        if(d[pow[n]-1][i]+graf[i][0]<ans)
            ans=d[pow[n]-1][i]+graf[i][0];
    }
    if(ans==inf)
        g<<"Nu exista solutie";
    else
        g<<ans<<'\n';

    return 0;
}