Cod sursa(job #1826462)

Utilizator giotoPopescu Ioan gioto Data 10 decembrie 2016 14:51:26
Problema Ciclu hamiltonian de cost minim Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
using namespace std;

int Sum, Min, x, y, n, m, c, f[22], st[22], a[22][22];
inline void back(int k){
    if(k == n + 1){
        if(a[st[n]][st[1]] > 0){
            Sum += a[st[n]][st[1]];
            if(Sum < Min)
                Min = Sum;
            Sum -= a[st[n]][st[1]];
        }
        return ;
    }
    for(int i = 0; i < n ; ++i){
        if(f[i] == 0){
            st[k] = i;
            if(a[st[k - 1]][st[k]] > 0){
                Sum = Sum + a[st[k - 1]][st[k]];
                f[i] = 1;
                back(k + 1);
                f[i] = 0;
                Sum = Sum - a[st[k - 1]][st[k]];
            }
        }
    }
}
int main()
{
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d", &x, &y);
        scanf("%d", &c);
        a[x][y] = c;
    }
    Min = 2000000000;
    for(int i = 0; i < n ; ++i){
        st[1] = i;
        f[i] = 1;
        Sum = 0;
        back(2);
        f[i] = 0;
    }
    printf("%d", Min);
    return 0;
}