Cod sursa(job #2076244)

Utilizator titusTitus A titus Data 26 noiembrie 2017 12:53:04
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
///Solutia 100p
#include <bits/stdc++.h>
#define INF 200000
using namespace std;

int Ct[21][21];
int C[1<<20][21];
int N, M, SOL;

int main()
{
    freopen("hamilton.in", "r", stdin);
    freopen("hamilton.out","w", stdout);

	/// citirea datelor
	int x, y, c;
	scanf("%d %d", &N, &M);
	for (int i=0; i<M; ++i) {
		scanf("%d %d %d", &x, &y, &c);
		Ct[x][y] = c;
	}

    memset(C, INF, sizeof C);
    C[0][1] = 0;
    for(int bit=1; bit < (1 << N); ++bit)
        for(int i=0; i<N; ++i)
            if(bit & (1<<i)){
                for(int j=0; j<N; ++j)
                    if(Ct[i][j] > 0 && !(bit & (1<<j)))
                        C[j][bit|(1<<j)] = min(C[j][bit|(1<<j)], C[i][bit] + Ct[i][j]);
            }

    ///determinam solutia
    SOL = INF;
    for(int i=0; i<N; ++i)
        if(Ct[i][0])
            SOL = min(SOL, C[i][(1 << N)-1] + Ct[i][0]);

	if (SOL >= INF) printf("Nu exista solutie\n");
               else printf("%d\n", SOL);
	return 0;
}