Pagini recente » Cod sursa (job #2400090) | Cod sursa (job #3271489) | Cod sursa (job #339972) | Cod sursa (job #169979) | Cod sursa (job #1603879)
#include<stdio.h>
using namespace std;
const int N = 1<<18, INF = 1000000000, M = 20;
int ad[M][M], d[N][M];
void init (int n)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
ad[i][j] = INF;
for (i = 0; i <= N - 1; i++)
for (j = 0; j < n; j++)
d[i][j] = INF;
}
int minimul (int a, int b)
{
if (a < b)
return a;
return b;
}
int main ()
{
FILE *in, *out;
in = fopen ("hamilton.in", "r");
out = fopen ("hamilton.out", "w");
int n, m;
fscanf (in, "%d%d", &n, &m);
int x, y, i, c;
init (n);
for (i = 1; i <= m; i++)
{
fscanf (in, "%d%d%d", &x, &y, &c);
ad[x][y] = c;
}
d[1][0] = 0;
int j, ct, minim, sol = 0;
for (i = 1; i < (1 << n); i += 2)
{
for (j = 1; j < n; j++)
{
if (i & (1<<j) != 0)
{
minim = INF;
for (ct = 0; ct < n; ct++)
{
if ((i & (1 << ct)) != 0 && ct != j)
minim = minimul (minim, ad[ct][j] + d[i^(1<<j)][ct]);
}
d[i][j] = minim;
}
}
}
minim = INF;
for (i = 1; i < n; i++)
{
minim = minimul (d[(1 << n) - 1][i] + ad[i][0], minim);
}
if (minim != INF)
fprintf (out, "%d",minim);
else
fprintf (out, "Nu exista solutie");
return 0;
}