00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "mincov_int.h"
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 int
00027 gimpel_reduce(A, select, weight, lb, bound, depth, stats, best)
00028 sm_matrix *A;
00029 solution_t *select;
00030 int *weight;
00031 int lb;
00032 int bound;
00033 int depth;
00034 stats_t *stats;
00035 solution_t **best;
00036 {
00037 register sm_row *prow, *save_sec;
00038 register sm_col *c1, *c2;
00039 register sm_element *p, *p1;
00040 int c1_col_num, c2_col_num, primary_row_num, secondary_row_num;
00041 int reduce_it;
00042
00043 reduce_it = 0;
00044 for(prow = A->first_row; prow != 0; prow = prow->next_row) {
00045 if (prow->length == 2) {
00046 c1 = sm_get_col(A, prow->first_col->col_num);
00047 c2 = sm_get_col(A, prow->last_col->col_num);
00048 if (c1->length == 2) {
00049 reduce_it = 1;
00050 } else if (c2->length == 2) {
00051 c1 = sm_get_col(A, prow->last_col->col_num);
00052 c2 = sm_get_col(A, prow->first_col->col_num);
00053 reduce_it = 1;
00054 }
00055 if (reduce_it) {
00056 primary_row_num = prow->row_num;
00057 secondary_row_num = c1->first_row->row_num;
00058 if (secondary_row_num == primary_row_num) {
00059 secondary_row_num = c1->last_row->row_num;
00060 }
00061 break;
00062 }
00063 }
00064 }
00065
00066 if (reduce_it) {
00067 c1_col_num = c1->col_num;
00068 c2_col_num = c2->col_num;
00069 save_sec = sm_row_dup(sm_get_row(A, secondary_row_num));
00070 sm_row_remove(save_sec, c1_col_num);
00071
00072 for(p = c2->first_row; p != 0; p = p->next_row) {
00073 if (p->row_num != primary_row_num) {
00074
00075 for(p1 = save_sec->first_col; p1 != 0; p1 = p1->next_col) {
00076 (void) sm_insert(A, p->row_num, p1->col_num);
00077 }
00078 }
00079 }
00080
00081 sm_delcol(A, c1_col_num);
00082 sm_delcol(A, c2_col_num);
00083 sm_delrow(A, primary_row_num);
00084 sm_delrow(A, secondary_row_num);
00085
00086 stats->gimpel_count++;
00087 stats->gimpel++;
00088 *best = sm_mincov(A, select, weight, lb-1, bound-1, depth, stats);
00089 stats->gimpel--;
00090
00091 if (*best != NIL(solution_t)) {
00092
00093 if (sm_row_intersects(save_sec, (*best)->row)) {
00094
00095 solution_add(*best, weight, c2_col_num);
00096 } else {
00097 solution_add(*best, weight, c1_col_num);
00098 }
00099 }
00100
00101 sm_row_free(save_sec);
00102 return 1;
00103 } else {
00104 return 0;
00105 }
00106 }