Cod sursa(job #2060470)

Utilizator vazanIonescu Victor Razvan vazan Data 8 noiembrie 2017 12:03:49
Problema Ciclu hamiltonian de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>

#define MMAX 400
#define NMAX 20/*
int val[MMAX], nxt[MMAX], last[MMAX], cost[MMAX];
int cnt = 0;
int add(int a, int b, int c){
    cnt++;
    val[cnt] = v;
    cost[cnt] = c;
    nxt[cnt] = last[a];
    last[a] = cnt;
}
*/
int ma[NMAX][NMAX], n, m;
int add(int a, int b, int c){
    ma[a][b] = c;
}
using namespace std;
const int INF = 100000000;
int p[NMAX], sol = INF;
bool frq[NMAX];

void bkt(int k){
    if(k > n){
        int cost = ma[p[n]][p[1]];
        for(int i = 1; i < n; i++){
            cost += ma[p[i]][p[i+1]];
            if(cost >= INF)
                return;
        }
        if(cost < sol)
         sol = cost;
        return;
    }
    for(int i = 0; i < n; i++)
        if(!frq[i]){
            frq[i] = 1;
            p[k] = i;
            bkt(k + 1);
            frq[i] = 0;
        }
}


int main(){
    ifstream fin("hamilton.in");
    ofstream fout("hamilton.out");
    fin >> n >> m;
    int a, b, c;
    for(int i = 0; i < NMAX; i++)
        for(int j = 0; j < NMAX; j++)
            ma[i][j] = INF;
    for(int i = 1; i <= m; i++){
        fin >> a >> b >> c;
        add(a, b, c);
    }
    bkt(1);
    if(sol < INF)
        fout << sol;
    else
        fout << "Nu exista solutie";
    return 0;
}