Nu aveti permisiuni pentru a descarca fisierul grader_test6.ok
Cod sursa(job #1012247)
Utilizator | Data | 18 octombrie 2013 16:10:08 | |
---|---|---|---|
Problema | Ciclu hamiltonian de cost minim | Scor | 90 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.43 kb |
#include <iostream>
#include <fstream>
using namespace std;
int n, m, sol, inf=2000000000;
int cost[20][20];
int solutii[20][1<<20];
ifstream f ("hamilton.in");
ofstream g ("hamilton.out");
void citeste ()
{
f>>n>>m;
int a, b, c;
for (int i=1; i<=m; i++)
{
f>>a>>b>>c;
a++; b++;
cost[a][b]=c;
}
}
int back (int nodanterior, int nr, int x)
{
if (solutii[nodanterior][x]!=0)
{
return solutii[nodanterior][x];
}
else
{
if (nr == n+1)
{
if(cost[nodanterior][1] != 0)
solutii[nodanterior][x] = cost[nodanterior][1];
else
solutii[nodanterior][x] = 0x3fffffff;
}
else
{
int minim, sol;
minim=0x3fffffff;
for (int i=1; i<=n; i++)
{
if (cost[nodanterior][i]!= 0 && (x & (1<<i)) == 0)
{
sol=cost[nodanterior][i]+back (i, nr+1, x ^ (1<<i));
if (minim>sol) minim=sol;
}
}
solutii[nodanterior][x]=minim;
}
// cout<<nodanterior<<' '<<nr<<' '<<solutii[nodanterior][x]<<'\n';
return solutii[nodanterior][x];
}
}
int main ()
{
citeste ();
sol=back (1, 2, 1 << 1);
if (sol==0x3fffffff) g<<"Nu exista solutie";
else
g<<sol;
return 0;
}