int solve(){ //Init MEM(lx, 0); MEM(ly, 0); MEM(left, 0); for (int i = 1; i <= sv; i ++) for (int j = 1; j <= tv; j ++) lx[i] = max(lx[i], w[i][j]); //Main for (int i = 1; i <= sv; i ++){ for (int j = 1; j <= tv; j ++) slack[j] = oo; while(1){ MEM(S, false); MEM(T, false); if (cross_path(i)){ break; } else{ int d = oo; for (int j = 1; j <= tv; j ++) if (!T[j]) d = min(d, slack[j]); for (int j = 1; j <= sv; j ++) if (S[j]) lx[j] -= d; for (int j = 1; j <= tv; j ++){ if (T[j]) ly[j] += d; else slack[j] -= d; //匈牙利树中T集点ly不变,S集点lx减小,更新slack值 } } } } int res = 0; for(int i = 1; i <= sv; i ++) res += lx[i]; for(int i = 1; i <= tv; i ++) res += ly[i]; return res; }
bool cross_path(int u){ S[u] = true; for (int v = 1; v <= tv; v ++){ if(T[v]) continue; int t = lx[u] + ly[v] - w[u][v]; if (t == 0){ T[v] = true; if (left[v] == 0 || cross_path(left[v])){ left[v] = u; return true; } } else{ slack[v] = min(slack[v], t); } } return false; }
void launch2(t_info *info, int n_path) { int compteur; int i; int tot; int tmp; tmp = info->nb_ants; i = 0; compteur = 0; tot = 0; while (i < n_path) tot += info->tab[i++]; i = 0; tmp -= tot; while (compteur < tmp) { i = -1; while (info->tab[++i] && compteur++ < tmp) info->tab[i]++; } free_map(info->list_line, info->list, info); cross_path(info, n_path); }
static void draw_node(cairo_t *cr, designer_node_t *n, int flags) { designer_node_type_t *nt = n->type; node_type_data_t *ntd = node_type_data(nt); node_data_t *nd = node_data(n); _point_t pos = nd->origin; cairo_save(cr); cairo_translate(cr, pos.x, pos.y); /* drop shadow */ cairo_set_source_rgba(cr, RGBA_DROP_SHADOW); round_path(cr, _offset(nd->nr, _size(3, 3)), round_s); cairo_fill(cr); /* title area color */ cairo_set_source_rgba(cr, RGBA_TITLE_AREA); round_path(cr, nd->tr, upper_s); cairo_fill(cr); /* title text */ set_title_font(cr); cairo_set_source_rgba(cr, RGBA_TITLE_TEXT); cairo_move_to(cr, nd->lr.o.x - 1, nd->lr.o.y + nd->lr.s.h - 1); cairo_show_text(cr, n->name); /* close button */ cairo_set_line_width(cr, 1.0); rect_path(cr, nd->xr); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.8); cairo_fill_preserve(cr); cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.5); cairo_stroke(cr); cross_path(cr, nd->xr, 2); cairo_stroke(cr); /* body area color */ cairo_set_source_rgba(cr, RGBA_BODY_AREA); round_path(cr, nd->br, lower_s); cairo_fill(cr); #if 0 /* slot border */ cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.3); cairo_set_line_width(cr, 1.0); rect_path(cr, nd->ir); cairo_stroke(cr); rect_path(cr, nd->or); cairo_stroke(cr); #endif /* prepare for slots */ cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.6); cairo_set_line_width(cr, 1.0); set_slot_font(cr); /* input slots */ for (int i=0; i<ntd->is; i++) { designer_slot_spec_t *slot = g_slist_nth_data(nt->input_slot_specs, i); slot_spec_data_t *ssd = slot_spec_data(slot); _point_t sl = _move(nd->ir.o, ssd->offset); cairo_move_to(cr, sl.x + 6, sl.y + 3); cairo_show_text(cr, slot->name); cairo_stroke(cr); circle_path(cr, sl, 3.0); cairo_stroke(cr); } for (int i=0; i<ntd->os; i++) { designer_slot_spec_t *slot = g_slist_nth_data(nt->output_slot_specs, i); slot_spec_data_t *ssd = slot_spec_data(slot); _rect_t sr = text_rect(cr, slot->name); _point_t sl = _move(nd->or.o, ssd->offset); cairo_move_to(cr, sl.x - sr.s.w - 8, sl.y + 3); cairo_show_text(cr, slot->name); cairo_stroke(cr); circle_path(cr, sl, 3.0); cairo_stroke(cr); } /* filter border */ cairo_set_line_width(cr, 1.0); cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.8); round_path(cr, nd->nr, round_s); cairo_stroke(cr); cairo_move_to(cr, nd->br.o.x, nd->br.o.y); cairo_line_to(cr, nd->br.o.x + nd->br.s.w, nd->br.o.y); cairo_stroke(cr); /* root node? */ if (flags & 0x1) { cairo_set_line_width(cr, 2.0); cairo_set_source_rgba(cr, RGBA_ROOT_NODE); // cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); // cairo_set_dash(cr, round_d, 2, 0); round_path(cr, _inset(nd->nr, _size(-3,-3)), rnd13_s); cairo_stroke(cr); } /* rect_path(cr, nd->ir); cairo_stroke(cr); rect_path(cr, nd->or); cairo_stroke(cr); */ cairo_restore(cr); }