Cod sursa(job #2305309)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 19 decembrie 2018 21:05:09
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
#include <limits>
#define N 19
#define INF 100000001
#define ll long long
#define f first
#define s second
using namespace std;
ifstream in("hamilton.in");
ofstream out("hamilton.out");
int dp[1<<N][N], g[N][N], c[N][N], p[N];
int main(){
    int n,m,x,y,w,k,i,j,mx=INF;
    in>>n>>m;
    for(i=0; i<n; ++i)
        for(j=0; j<n; ++j)
            c[i][j]=INF;
    for(i=1; i<=m; ++i){
        in>>x>>y>>w;
        g[y][++p[y]]=x;
        c[x][y]=w;
    }
    for(i=0; i<(1<<n); ++i){
        for(j=0; j<n; ++j){
            dp[i][j]=INF;
            if(i==1 && !j)
                dp[1][0]=0;
            if(i&(1<<j))
                for(k=1; k<=p[j]; ++k)
                    if(i&(1<<g[j][k]))
                        dp[i][j]=min(dp[i][j], dp[i^(1<<j)][g[j][k]]+c[g[j][k]][j]);
        }
    }
    for(i=1; i<=p[0]; ++i)
        mx=min(mx, dp[(1<<n)-1][g[0][i]]+c[g[0][i]][0]);
    if(mx>=INF) out<<"Nu exista solutie";
    else out<<mx;
    return 0;
}