Pagini recente » Cod sursa (job #2590816) | Cod sursa (job #34285) | Cod sursa (job #495548) | Cod sursa (job #2836245) | Cod sursa (job #990232)
Cod sursa(job #990232)
#include <fstream>
#include <vector>
#include <utility>
#define inf 1<<30
#define x first
#define y second
#define vint vector<int>::iterator
using namespace std;
ifstream fin("hamilton.in");
ofstream fout("hamilton.out");
vector <int> G[20];
long long hamilton[1<<18][18],m[18][18],minv,n,M,a,b,c,nr;
int main()
{
fin>>n>>M;
for (int i=0; i<n; ++i)
for (int j=0; j<n; ++j) m[i][j]=inf;
for (int i=1; i<=M; ++i)
{
fin>>a>>b>>c;
G[a].push_back(b);
m[a][b]=c;
}
nr = (1<<n);
for (int i=0; i<nr; ++i)
for (int j=0; j<n; ++j) hamilton[i][j] = inf;
for (vint it=G[0].begin(); it!=G[0].end(); ++it) hamilton[1+(1<<*it)][*it] = m[0][*it];
for (int i=1; i<nr-1; ++i)
{
for (int j=1; j<n; ++j)
{
if (hamilton[i][j]!=inf)
{
for (vint it = G[j].begin(); it != G[j].end(); ++it)
{
if ((i | (1<<*it))!=i) hamilton [i | (1<<*it)][*it] = min (hamilton[i | (1<<*it)][*it],hamilton [i][j] + m[j][*it]);
}
}
}
}
minv = inf;
for (int i=1; i<n; ++i)
{
minv = min (minv,hamilton[nr-1][i]+m[i][0]);
}
if (minv==inf) fout<<"Nu exista solutie";
else fout<<minv;
}