Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 2 KB
#include <stdio.h>
#include <time.h>
#define MaxN 30
#define MaxM 435
typedef unsigned char byte;
typedef unsigned short int word;
typedef unsigned long int dword;
int N, M;
byte Route[MaxM][2];
dword Bitmask[MaxN];
dword Full;
bool Read (const char *);
void MakeBitmasks (void);
void Backtrack (dword, int, int, int &);
void Print (void);
int main (int AN, char * Args []) {
int Min;
clock_t T;
if (AN < 2)
return 1;
if (!Read(Args[1]))
return 1;
MakeBitmasks();
T = clock();
Min = N;
Backtrack(0, 0, 0, Min);
T = clock() - T;
printf("%d\n", Min);
printf("Time: %.2f s\n", (1.0 * T) / CLOCKS_PER_SEC);
return 0;
}
bool Read (const char * FN) {
FILE * F = fopen(FN, "r");
if (F == NULL)
return false;
fscanf(F, "%d %d\n", &N, &M);
for (int I = 0; I < M; I++) {
fscanf(F, "%d %d\n", &Route[I][0], &Route[I][1]);
Route[I][0]--;
Route[I][1]--;
}
fclose(F);
return true;
}
void MakeBitmasks (void) {
int I, J;
for (I = 0; I < N; I++) {
Bitmask[I] = 1 << I;
for (J = 0; J < M; J++) {
if (Route[J][0] == I)
Bitmask[I] |= 1 << Route[J][1];
else if (Route[J][1] == I)
Bitmask[I] |= 1 << Route[J][0];
}
}
Full = (1 << N) - 1;
}
void Backtrack (dword Covered, int Depth, int X, int & Min) {
if (Covered == Full) {
if (Depth < Min)
Min = Depth;
return;
}
for (int I = X; I < N; I++)
if ((Covered & Bitmask[I]) != Bitmask[I])
Backtrack(Covered | Bitmask[I], Depth + 1, I + 1, Min);
}
void Print (void) {
int I, J;
for (I = 0; I < N; I++) {
for (J = 0; J < N; J++)
printf("%d", Bitmask[I] & (1 << J) ? 1 : 0);
printf("\n");
}
}