Cod sursa(job #2648629)

Utilizator Vlad.Vlad Cristian Vlad. Data 12 septembrie 2020 00:25:22
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#define NMAX 25
#define INF 0x3f3f3f3f
#define RMAX (1 << 20) + 5
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int N, M;
int c[NMAX][NMAX];
int d[RMAX][NMAX];
vector<vector<int>> gr;
void read() {
    int x, y, z;
    fin >> N >> M;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            c[i][j] = INF;
        }
    }
    gr.resize(N + 1);
    for (int i = 0; i < M; ++i) {
        fin >> x >> y >> z;
        gr[y].push_back(x);
        c[x][y] = z;
    }
}
int main()
{
    read();
    for (int i = 0; i < (1 << N); ++i) {
        for (int j = 0; j < N; ++j) {
            d[i][j] = INF;
        }
    }
    d[1][0] = 0;
    for (int i = 0; i < (1 << N); ++i) {
        for (int j = 0; j < N; ++j) {
            if (i & (1 << j)) {
                for (int k = 0; k < gr[j].size(); ++k) {
                    if (i & (1 << gr[j][k])) {
                        d[i][j] = min(d[i][j], d[i ^ (1 << j)][gr[j][k]] + c[gr[j][k]][j]);
                    }
                }
            }
        }
    }
    int ans = INF;
    for (int i = 0; i < gr[0].size(); ++i) {
        ans = min(ans, d[(1 << N) - 1][gr[0][i]] + c[gr[0][i]][0]);
    }
    if (ans == INF) {
        fout << "Nu exista solutie\n";
    }
    else {
        fout << ans << "\n";
    }
    return 0;
}