Cod sursa(job #2126920)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 10 februarie 2018 10:08:07
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int dp[20][(1<<18)+5],mCost[20][20],m,n;
vector <int> G[20];
void citire()
{
    int nod1,nod2,cost;
    scanf("%d%d",&n,&m);
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
        {
            mCost[i][j]=0x3f3f3f3f;
        }
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d",&nod1,&nod2,&cost);
        mCost[nod1][nod2]=cost;
        G[nod2].push_back(nod1);
    }
}
void ciclumin()
{
    for(int j=1; j<(1<<n); j++)
        for(int i=0; i<n; i++)
            if(j&(1<<i))
                for(auto it:G[i])
                {
                    if(j&(1<<it))
                        dp[i][j]=min(dp[it][j^(1<<i)]+mCost[it][i],dp[i][j]);
                }
}
int main()
{
    freopen("hamilton.in","r",stdin);
    freopen("hamilton.out","w",stdout);
    citire();
    for(int i=0; i<n; i++)
        for(int j=1; j<(1<<n); j++)
            dp[i][j]=0x3f3f3f3f;

    dp[0][1]=0;
    ciclumin();
    int rasp=0x3f3f3f3f;
    for(auto ii:G[0])
        rasp=min(dp[ii][(1<<n)-1]+mCost[ii][0],rasp);


    if(rasp!=0x3f3f3f3f)
        printf("%d",rasp);
    else
        printf("Nu exista solutie");
    return 0;
}