bool List_Triplets(const GraphT & g, std::vector< Triplet > & vec_triplets) { // Algorithm // //-- For each node // - list the outgoing not visited edge // - for each tuple of edge // - if their end are connected // Detected cyle of length 3 // Mark first edge as visited typedef typename GraphT::OutArcIt OutArcIt; typedef typename GraphT::NodeIt NodeIterator; typedef typename GraphT::template EdgeMap<bool> BoolEdgeMap; BoolEdgeMap map_edge(g, false); // Visited edge map // For each nodes for (NodeIterator itNode(g); itNode != INVALID; ++itNode) { // For each edges (list the not visited outgoing edges) std::vector<OutArcIt> vec_edges; for (OutArcIt e(g, itNode); e!=INVALID; ++e) { if (!map_edge[e]) // If not visited vec_edges.push_back(e); } // For all tuples look of ends of edges are linked while(vec_edges.size()>1) { OutArcIt itPrev = vec_edges[0]; // For all tuple (0,Inth) for(size_t i=1; i < vec_edges.size(); ++i) { // Check if the extremity is linked typename GraphT::Arc cycleEdge = findArc(g, g.target(itPrev), g.target(vec_edges[i])); if (cycleEdge!= INVALID && !map_edge[cycleEdge]) { // Elementary cycle found (make value follow a monotonic ascending serie) int triplet[3] = { g.id(itNode), g.id(g.target(itPrev)), g.id(g.target(vec_edges[i]))}; std::sort(&triplet[0], &triplet[3]); vec_triplets.push_back(Triplet(triplet[0],triplet[1],triplet[2])); } } // Mark the current ref edge as visited map_edge[itPrev] = true; // remove head to list remaining tuples vec_edges.erase(vec_edges.begin()); } } return (!vec_triplets.empty()); }
void player_build_move(gint player_num, gint sx, gint sy, gint spos, gint dx, gint dy, gint dpos, gint isundo) { Edge *from = map_edge(callbacks.get_map(), sx, sy, spos), *to = map_edge(callbacks.get_map(), dx, dy, dpos); if (isundo) { Edge *tmp = from; from = to; to = tmp; } from->owner = -1; callbacks.draw_edge(from); from->type = BUILD_NONE; to->owner = player_num; to->type = BUILD_SHIP; callbacks.draw_edge(to); if (isundo) log_message(MSG_BUILD, _("%s has cancelled a ship's movement.\n"), player_name(player_num, TRUE)); else log_message(MSG_BUILD, _("%s moved a ship.\n"), player_name(player_num, TRUE)); }
/* translate_drawing: * Translate and/or rotate nodes, spline points, and bbox info if * Offset is non-trivial. * Also, if Rankdir, reset ND_lw, ND_rw, and ND_ht to correct value. */ static void translate_drawing(graph_t * g) { node_t *v; edge_t *e; int shift = (Offset.x || Offset.y); if (!shift && !Rankdir) return; for (v = agfstnode(g); v; v = agnxtnode(g, v)) { if (Rankdir) dot_nodesize(v, FALSE); if (shift) { ND_coord_i(v) = map_point(ND_coord_i(v)); if (State == GVSPLINES) for (e = agfstout(g, v); e; e = agnxtout(g, e)) map_edge(e); } } if (shift) translate_bb(g, GD_rankdir(g)); }
void player_build_remove(gint player_num, BuildType type, gint x, gint y, gint pos) { Edge *edge; Node *node; switch (type) { case BUILD_ROAD: edge = map_edge(callbacks.get_map(), x, y, pos); edge->owner = -1; callbacks.draw_edge(edge); edge->type = BUILD_NONE; log_message(MSG_BUILD, _("%s removed a road.\n"), player_name(player_num, TRUE)); if (player_num == my_player_num()) stock_replace_road(); break; case BUILD_SHIP: edge = map_edge(callbacks.get_map(), x, y, pos); edge->owner = -1; callbacks.draw_edge(edge); edge->type = BUILD_NONE; log_message(MSG_BUILD, _("%s removed a ship.\n"), player_name(player_num, TRUE)); if (player_num == my_player_num()) stock_replace_ship(); break; case BUILD_SETTLEMENT: node = map_node(callbacks.get_map(), x, y, pos); node->type = BUILD_NONE; node->owner = -1; callbacks.draw_node(node); log_message(MSG_BUILD, _("%s removed a settlement.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_SETTLEMENTS, -1); if (player_num == my_player_num()) stock_replace_settlement(); break; case BUILD_CITY: node = map_node(callbacks.get_map(), x, y, pos); node->type = BUILD_SETTLEMENT; node->owner = player_num; callbacks.draw_node(node); log_message(MSG_BUILD, _("%s removed a city.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_SETTLEMENTS, 1); player_modify_statistic(player_num, STAT_CITIES, -1); if (player_num == my_player_num()) { stock_use_settlement(); stock_replace_city(); } break; case BUILD_CITY_WALL: node = map_node(callbacks.get_map(), x, y, pos); node->city_wall = FALSE; node->owner = player_num; callbacks.draw_node(node); log_message(MSG_BUILD, _("%s removed a city wall.\n"), player_name(player_num, TRUE)); player_modify_statistic(player_num, STAT_CITY_WALLS, -1); if (player_num == my_player_num()) stock_replace_city_wall(); break; case BUILD_NONE: log_message(MSG_ERROR, _("" "player_build_remove called with BUILD_NONE for user %s\n"), player_name(player_num, TRUE)); break; case BUILD_BRIDGE: edge = map_edge(callbacks.get_map(), x, y, pos); edge->owner = -1; callbacks.draw_edge(edge); edge->type = BUILD_NONE; log_message(MSG_BUILD, _("%s removed a bridge.\n"), player_name(player_num, TRUE)); if (player_num == my_player_num()) stock_replace_bridge(); break; case BUILD_MOVE_SHIP: /* This clause here to remove a compiler warning. It should not be possible to reach this case. */ g_error("Bug: unreachable code reached"); break; } }