Cod sursa(job #2978962)

Utilizator CobzaruAntonioCobzaru Paul-Antonio CobzaruAntonio Data 14 februarie 2023 18:07:55
Problema Ciclu hamiltonian de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
#define pb push_back
using namespace std;
ifstream cin ("hamilton.in");
ofstream cout ("hamilton.out");
vector <int> g[20];
int dp[1<<18][18];
int n,m;
int answ = 2e9;
int dist[19][19];
int calculare (int masca,int vf)
{
    if (dp[masca][vf] == -1)
    {
        dp[masca][vf] = 2e9;
        for (auto ult:g[vf])
            if ((1<<ult)&masca)
                dp[masca][vf] = min(dp[masca][vf],calculare(masca^(1<<vf),ult) + dist[vf][ult]);
    }
    return dp[masca][vf];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int i,j;
    cin >> n >> m;
    for (i=0;i<n;i++)
        for (j=0;j<n;j++)
            dist[i][j] = 2e9;
    for (i=1;i<=m;i++)
    {
        int x,y,c;
        cin >> x >> y >> c;
        g[y].pb(x);
        dist[y][x] = c;
    }
    for (i=0;i<(1<<n);i++)
        for (j=0;j<n;j++)
            dp[i][j] = -1;
    dp[1<<0][0] = 0;
    for (auto vf:g[0])
        answ = min(answ,calculare(((1<<n)-1),vf) + dist[0][vf]);
    if (answ == 2e9)
        cout << "Nu exista solutie";
    else
        cout << answ;
    return 0;
}