Cod sursa(job #1967231)

Utilizator MithrilBratu Andrei Mithril Data 16 aprilie 2017 11:40:38
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define GET_SIZE(x) (((double)sizeof(x))/1024/1024)

using namespace std;

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
int n,m;
int cost[20][20];
int dp[(1<<18)][20];

int main()
{
    cout<<GET_SIZE(dp);
    fin>>n>>m;
    for(int i=1;i<=m;i++) {
        int x,y,z;
        fin>>x>>y>>z;
        cost[x][y]=z;
    }
    memset(dp,INF,sizeof(dp));
    dp[1][0]=0;
    int stareFinala=(1<<(n))-1;
    for(int stare=1;stare<=stareFinala;stare++) {
        for(int i=0;i<n;i++) {
            if(stare&(1<<i)) {
                for(int j=0;j<n;j++) {
                    if(cost[i][j]&&!(stare&(1<<j))) {
                        dp[stare|(1<<j)][j]=min(dp[stare|(1<<j)][j],dp[stare][i]+cost[i][j]);
                    }
                }
            }
        }
    }
    int answer = INF;
    for(int i=1;i<n;i++) if(cost[i][0]) answer=min(answer,dp[stareFinala][i]+cost[i][0]);
    if(answer==INF) fout<<"Nu exista solutie";
    else fout<<answer;
    return 0;
}