Cod sursa(job #2364667)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 4 martie 2019 10:21:25
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define pii pair <int, int>
#define INF 0x3f3f3f3f

using namespace std;

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

int dp[(1<<19)][20]; // dp[i][j]-costul minim al unui ciclu care contine nodurile
                     // din confij lui i si se termina in nodul j
int n, m;
int a[20][20];
vector <int> v[20];

int main()
{
    f >> n >> m;
    for (int i = 1, x, y, c; i <= m; i++)
    {
        f >> x >> y >> c;
        a[x][y]=c;
        v[x].push_back(y);
    }

    memset(dp, INF, sizeof(dp));

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

    for (int stare = 0; stare < p; stare++)
    {
        for (int i = 0; i < n; i++)
            if(stare&(1<<i))
            {
                for (auto k:v[i])
                {
                    if(stare&(1<<k))
                        dp[stare][i]=min(dp[stare][i], dp[stare^(1<<i)][k]+a[i][k]);
                }
            }
    }

    int ans=INF;
    for (int i = 0; i < n; i++)
        if(a[0][i]!=0) ans=min(ans, dp[p-1][i]+a[0][i]);

    if(ans!=INF) g << ans;
    else g << "Nu exista solutie";
    return 0;
}