Cod sursa(job #2036171)

Utilizator rangal3Tudor Anastasiei rangal3 Data 10 octombrie 2017 13:48:03
Problema Ciclu hamiltonian de cost minim Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <bitset>
#define in "hamilton.in"
#define out "hamilton.out"
#define N 20
#define oo 2e8

using namespace std;

ifstream fin(in);
ofstream fout(out);

int n,m,c,x,y;
int cmin = oo;
int v[N][N]; //verificam daca exista dupa n noduri parcurse drum de la nodul actual la cel initial
int init;

bitset<N> f;

void citire()
{
    fin>>n>>m;
    while(m--)
    {
        fin>>x>>y>>c;
        v[x][y] = c;
    }
}

inline void BK(const int &nod,const int &ct,const int &cost) // parcurgem nodul nod, am parcurs ct noduri. costul actual este cost
{
    if(ct == n)
    {
        if(v[nod][init] != 0)
            cmin = min(cmin,cost + v[nod][init]);
    }
    else
    {
        for(int i=0; i<n; ++i)
            if(!f[i] && v[nod][i] != 0)
            {
                f[i] = 1;
                BK(i, ct+1, cost + v[nod][i]);
                f[i] = 0;
            }
    }
}

int main()
{
    citire();

    for(int i=0; i<n; ++i)
    {
        f[i] = 1;
        init = i;
        BK(i,1,0);
        f[i] = 0;
    }

    if(cmin != oo) fout<<cmin<<"\n";
        else fout<<"Nu exista solutie";

    fin.close(); fout.close();
    return 0;
}