Cod sursa(job #1597720)

Utilizator ciprianprohozescuProhozescu Ciprian ciprianprohozescu Data 12 februarie 2016 11:38:59
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#define NMAX 100
#define INF 1000000000

using namespace std;

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");

int n, m, A[NMAX][NMAX], t[NMAX], lgt, tmin[NMAX], lgmin = INF;
bool use[NMAX];

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

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

void citire()
{
    int i, x, y, lg;
    fin >> n >> m;
    for (i = 1; i <= m; i++)
    {
        fin >> x >> y >> lg;
        x++;
        y++;
        A[x][y] = lg;
    }
}
void bkt(int k)
{
    int i;
    if (k == n + 1)
    {
        if (A[t[n]][1] != 0) //pot sa revin
        {
            if (lgt + A[t[n]][1] < lgmin)
            {
                lgmin = lgt + A[t[n]][1];
                for (i = 1; i <= n; i++)
                    tmin[i] = t[i];
            }
        }
    }
    else //nu e complet traseul
    {
        for (i = 1; i <= n; i++)
        {
            if (!use[i] && A[t[k - 1]][i])
            {
                t[k] = i;
                use[i] = 1;
                lgt += A[t[k - 1]][i];
                bkt(k + 1);
                use[i] = 0;
                lgt -= A[t[k - 1]][i];
            }
        }
    }
}
void afisare()
{
    if (lgmin == INF)
        fout << "Nu exista solutie/n";
    else
    {
        fout << lgmin << '\n';
        /*for (i = 1; i <= n; i++)
            fout << tmin[i] << ' ';
        fout << '\n';*/
    }
    fout.close();
}