Cod sursa(job #1904482)

Utilizator linia_intaiConstantinescu Iordache Ciobanu Noi cei din linia intai linia_intai Data 5 martie 2017 16:19:00
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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 dp[NMAX][1 << NMAX];

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[b].push_back(make_pair(a, c));
    }

    dp[0][1] = 0;
    for (int mask = 2; mask < (1 << N); ++ mask)
        for (int node = 0; node < N; ++ node)
            if (mask & (1 << node)) {
                dp[node][mask] = INF;
                for (int i = 0; i < graph[node].size(); ++ i) {
                    int someone = graph[node][i].first;
                    if (mask & (1 << someone)) {
                        int cost = graph[node][i].second;
                        int aux = dp[someone][mask ^ (1 << node)] + cost;

                        if (aux < dp[node][mask])
                            dp[node][mask] = aux;
                    }
                }
            }

    int ans = INF;
    for (int i = 0; i < graph[0].size(); ++ i) {
        int someone = graph[0][i].first;
        int cost = graph[0][i].second;
        int aux = dp[someone][(1 << N) - 1] + cost;
        if (aux < ans)
            ans = aux;
    }

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