Cod sursa(job #1012252)

Utilizator diana97Diana Ghinea diana97 Data 18 octombrie 2013 16:19:20
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
using namespace std;

int n, m, sol;
int cost[20][20];
int solutii[20][1<<20];

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

void citeste ()
{
    f>>n>>m;
    int a, b, c;
    for (int i=1; i<=m; i++)
    {
        f>>a>>b>>c;
        a++; b++;
        cost[a][b]=c;
    }
}


int back (int nodanterior, int x)
{
    if (solutii[nodanterior][x]!=0)
    {
        return solutii[nodanterior][x];
    }
    else
    {
        if (x==(1<<n+1)-2)
        {
            //cout<<x<<' '<<;
            if(cost[nodanterior][1] != 0)
                solutii[nodanterior][x] = cost[nodanterior][1];
            else
                solutii[nodanterior][x] = 0x3fffffff;
        }
        else
        {
            int minim, sol;
            minim=0x3fffffff;
            for (int i=2; i<=n; i++)
            {
                if (cost[nodanterior][i]!= 0 && (x & (1<<i)) == 0)
                {
                    sol=cost[nodanterior][i]+back (i, x ^ (1<<i));
                    if (minim>sol) minim=sol;
                }
            }
            solutii[nodanterior][x]=minim;
        }
        return solutii[nodanterior][x];
    }
}

int main ()
{
    citeste ();
    sol=back (1, 1 << 1);
    if (sol==0x3fffffff) g<<"Nu exista solutie";
    else g<<sol;
    return 0;
}