Cod sursa(job #1917122)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 9 martie 2017 11:14:16
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("hamilton.in");
ofstream g("hamilton.out");

const int NMax = 18;
const int INF = 0x3f3f3f3f;

int n,m,x,y,c;
int dp[(1<<NMax) + 2][NMax + 2], di[NMax + 2][NMax + 2];
vector<pair<int,int> > G[NMax];

int main()
{
    f >> n >> m;
    memset(di,INF,sizeof(di));
    memset(dp,INF,sizeof(dp));
    for(int i = 0; i < m; ++i){
        f >> x >> y >> c;
        di[x][y] = c;
        G[x].push_back(make_pair(y,c));
    }
    dp[1][0] = 0;
    for(int mask = 1; mask < (1 << n); ++mask){

        for(int i = 0; i < n; ++i){
            if(mask & (1 << i)){

                for(int j = 0; j < G[i].size(); ++j){
                    int v = G[i][j].first;

                    if(!(mask & (1 << v))){
                        dp[mask | (1 << v)][v] = min(dp[mask | (1 << v)][v], dp[mask][i] + G[i][j].second);
                    }
                }
            }
        }
    }
    int ans = INF;
    for(int i = 0; i < n; ++i){
        if(dp[(1 << n) - 1][i] != INF && di[i][0] != INF)
            ans = min(ans,dp[(1 << n) - 1][i] + di[i][0]);
    }
    if(ans >= INF)
        g << "Nu exista solutie" << '\n';
    else
        g << ans << '\n';
    return 0;
}