Mai intai trebuie sa te autentifici.
Cod sursa(job #2722114)
Utilizator | Data | 12 martie 2021 16:31:20 | |
---|---|---|---|
Problema | Ciclu hamiltonian de cost minim | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.28 kb |
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
const int NMAX = 18;
int dp[1<<NMAX][NMAX];
const int inf = (1<<30);
vector<pair<int, int> >v[NMAX];
int main()
{
int n, m, x, y, c, mask, i;
fin>>n>>m;
for(i=1; i<=m; i++)
{
fin>>x>>y>>c;
v[x].push_back({y, c});
}
for(mask=0; mask<=(1<<n); mask++)
{
for(i=0; i<n; i++)
{
dp[mask][i] = inf;
}
}
dp[1][0] = 0;
for(mask=0; mask<(1<<n); mask++)
{
for(i=1; i<n; i++)
{
if(mask & (1<<i))
{
for(auto el : v[i])
{
int j = el.first;
c = el.second;
dp[mask][i] = min(dp[mask][i], dp[mask - (1<<i)][j] + c);
}
}
}
}
int rez = inf;
for(auto el : v[0])
{
int j = el.first;
int c = el.second;
rez = min(rez, dp[(1<<n) - 1][j] + c);
}
if(rez == inf)
{
fout<<"Nu exista solutie";
}
else
{
fout<<rez;
}
fin.close();
fout.close();
return 0;
}