Cod sursa(job #1307516)

Utilizator gabrieligabrieli gabrieli Data 2 ianuarie 2015 14:33:24
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdint>
#include <algorithm>
#include <fstream>
#include <vector>
#include <limits>
using namespace std;

const uint32_t INF = 24000000;

int main() {
    ifstream fin("hamilton.in");
    ofstream fout("hamilton.out");
    
    int n, m; fin >> n >> m;
    
    vector<vector<uint32_t>> cost(n, vector<uint32_t>(n, INF));
    for (int x, y, c; m--;) {
        fin >> x >> y >> c;
        cost[x][y] = c;
    }
    
    vector<vector<uint32_t>> dp(1ul << n, vector<uint32_t>(n, INF));
    
    dp[1][0] = 0;
    for (uint32_t v = 1; v < (1ul << n); v += 2)
        for (int j = 1; j < n; ++j)
            if ((1ul << j) & v)
                for (int k = 0; k < n; ++k)
                    if (v & (1ul << k))                  
                        dp[v][j] = min(dp[v][j],
                                dp[v ^ (1ul << j)][k] + cost[k][j]);

    uint32_t result = INF;
    for (int k = 1; k < n; ++k)
        result = min(result, dp[(1ul << n) - 1][k] + cost[k][0]);
        
    if (result < INF) fout << result << endl;
    else fout << "Nu exista solutie" << endl;
    
    return 0;
}