Cod sursa(job #2528457)

Utilizator Rares31100Popa Rares Rares31100 Data 21 ianuarie 2020 21:47:19
Problema Ciclu hamiltonian de cost minim Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
#define Inf 30000001

using namespace std;

ifstream in("hamilton.in");
ofstream out("hamilton.out");

int n,m;
int dp[(1<<18)][18];
int cost[18][18];
vector <int> gft[18];

int main()
{
    in>>n>>m;

    for(int i,j,ct,k=1;k<=m;k++)
    {
        in>>i>>j>>ct;

        cost[i][j]=ct;
        gft[j].push_back(i);
    }

    for(int i=1;i<=(1<<n)-1;i++)
        for(int j=0;j<=n-1;j++)
            dp[i][j]=Inf;

    for(int i=0;i<n;i++)
        dp[(1<<i)][i]=0;

    for(int i=1;i<=(1<<n)-1;i++)
        for(int j=0;j<=n-1;j++)
            if( i&(1<<j) )
            {
                int nod=j;

                for(auto vec:gft[nod])
                    if( i&(1<<vec) )
                        dp[i][nod]=min(dp[i][nod],dp[i-(1<<nod)][vec]+cost[vec][nod]);
            }

    int minim=Inf;

    for(auto vec:gft[0])
        minim=min(minim,dp[(1<<n)-1][vec]+cost[vec][0]);

    if(minim<Inf)
        out<<minim;
    else
        out<<"Nu exista solutie";

    return 0;
}