Cod sursa(job #1597733)

Utilizator stanciuionutStanciu Ioan stanciuionut Data 12 februarie 2016 11:44:05
Problema Ciclu hamiltonian de cost minim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#define NMAX 100
#define INF 1000000000

using namespace std;

int n, m;
int a[NMAX][NMAX];
bool uz[NMAX];
int t[NMAX], tmin[NMAX];
int lgt, lgmin = INF;

void citire();
void afisare();
void bkt(int k);

int main()
{
    citire();
    t[1] = 1;
    uz[1] = 1;
    bkt(2);
    afisare();
    return 0;
}

void citire()
{
    ifstream fin("hamilton.in");
    int i, x, y, Lg;
    fin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y >> Lg;
        a[x + 1][y + 1] = Lg;
    }
}

void afisare()
{
    int i;
    ofstream fout("hamilton.out");
    if (lgmin == INF)
        fout << "Nu exista solutie" << '\n';
    else
    {
        fout << lgmin << '\n';
    }
    fout.close();
}

void bkt(int k)
{
    int i;
    if (k - 1 == n)
    {
        if (a[t[n]][1])
        {
            if (lgt + a[t[n]][1] < lgmin)
            {
                lgmin = lgt + a[t[n]][1];
                for (i = 1; i <= n; i++)
                    tmin[i] = t[i];
            }
        }
    }
    else
    {
        for (i = 1; i <= n; i++)
            if (!uz[i] && a[t[k - 1]][i])
            {
                t[k] = i;
                uz[i] = 1;
                lgt += a[t[k - 1]][i];
                bkt(k + 1);
                uz[i] = 0;
                lgt -= a[t[k - 1]][i];
            }
    }
}