Cod sursa(job #1904439)

Utilizator linia_intaiConstantinescu Iordache Ciobanu Noi cei din linia intai linia_intai Data 5 martie 2017 15:47:31
Problema Ciclu hamiltonian de cost minim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
#include <utility>

using namespace std;

const int NMAX = 18;
const int INF = 1E9;

int N, M;
vector <pair <int, int> > graph[NMAX + 1];

int backtr(int node, int vis) {
    int ans = INF;
    if (vis == ((1 << N) - 1)) {
        for (int i = 0; i < graph[node].size(); ++ i)
            if (graph[node][i].first == 0)
                ans = graph[node][i].second;
    }
    else {
        for (int i = 0; i < graph[node].size(); ++ i)
            if (!(vis & (1 << (graph[node][i].first)))) {
                int current = graph[node][i].second + backtr(graph[node][i].first, vis | (1 << (graph[node][i].first)));
                if (current < ans)
                    ans = current;
            }
    }
    return ans;
}

int main()
{
    ifstream cin("hamilton.in");
    ofstream cout("hamilton.out");

    cin >> N >> M;

    for (int i = 0; i < M; ++ i) {
        int a, b, c;
        cin >> a >> b >> c;
        graph[a].push_back(make_pair(b, c));
    }

    int ans = backtr(0, 1);

    if (ans == INF)
        cout << "Nu exista solutie\n";
    else
        cout << ans << '\n';
    return 0;
}