Exemple #1
0
int augmentPath(t_graph* resNet, int v, int t, int flow)
{
  int n,min;
  if(resNet!=NULL && !resNet->vertices[v].visited)
    {
      if(v==t)
	return flow;
      resNet->vertices[v].visited=TRUE;
      for(n=nextNeighbor(resNet,v,-1);n<resNet->v;n=nextNeighbor(resNet,v,n))
	{
	  if(!resNet->vertices[n].visited)
	    {
	      if(resNet->am[v][n]<flow)
		min=resNet->am[v][n];
	      else
		min=flow;
	    }
	      if((min=augmentPath(resNet,n,t,min))>0)
	    {
	      if(resNet->am[v][n]!=INF)
		resNet->am[v][n] -= min;
	      if(resNet->am[n][v]!=INF)
		resNet->am[n][v] += min;
	      return min;
	    }
	}
      return 0;
    }
}
int jumpPointTools::jump(const map& a_map, const std::pair<int, Direction> a_neighbor, std::pair<int, Direction>& a_jumpPoint, const int a_targetPosition, const int* a_oneStepMove) 
{
  // if it's an obstacle
  if (!a_map[a_neighbor.first])
    {
      return -1;
    }
  if (a_neighbor.first == a_targetPosition)
    {
      a_jumpPoint = a_neighbor;
      return 1;
    }
  // really have no use for this except need it to call the function
  std::vector<std::pair<int, Direction> > dummy;
  if (findForcedNeighbors(a_map, a_neighbor.first, a_neighbor.second, dummy, a_oneStepMove))
    {
      a_jumpPoint = a_neighbor;
      return 1;
    }
  // if this came from a diagonal guy check the 2 straight directions
  Direction decompose [2];
  if (dirHelper.decomposeDiagonal(a_neighbor.second,decompose))
    {
      for (int j = 0; j < 2; j++)
	{
	  std::pair<int, Direction> nextNeighbor(a_neighbor.first + a_oneStepMove[decompose[j]], decompose[j]);
	  if (jump(a_map, nextNeighbor, a_jumpPoint, a_targetPosition, a_oneStepMove) == 1)
	    {
	      a_jumpPoint = a_neighbor;
	      return 1;
	    }
	}
    }

  // the next guy to check traversing in this direction
  std::pair<int, Direction> nextNeighbor(a_neighbor.first + a_oneStepMove[a_neighbor.second], a_neighbor.second);

  return jump(a_map, nextNeighbor, a_jumpPoint, a_targetPosition, a_oneStepMove);

}
int jumpPointTools::jump(const map& a_map, const std::pair<int, Direction> a_neighbor, std::tuple<int, Direction, bool>& a_jumpPoint, const int* a_oneStepMove) 
{
  // if it's an obstacle, then the previous guy is a sterile jump point
  if (!a_map[a_neighbor.first])
    {
      int previousPosition = a_neighbor.first - a_oneStepMove[a_neighbor.second];
      a_jumpPoint = std::make_tuple(previousPosition, a_neighbor.second, false);
      return -1;
    }
  // really have no use for this except need it to call the function
  std::vector<std::pair<int, Direction> > dummy;
  if (findForcedNeighbors(a_map, a_neighbor.first, a_neighbor.second, dummy, a_oneStepMove))
    {
      a_jumpPoint = std::make_tuple(a_neighbor.first, a_neighbor.second, true);
      return 1;
    }
  // if this came from a diagonal guy check the 2 straight directions
  Direction decompose [2];
  if (dirHelper.decomposeDiagonal(a_neighbor.second,decompose))
    {
      for (int j = 0; j < 2; j++)
	{
	  std::pair<int, Direction> nextNeighbor(a_neighbor.first + a_oneStepMove[decompose[j]], decompose[j]);
	  if (jump(a_map, nextNeighbor, a_jumpPoint, a_oneStepMove) == 1)
	    {
	      a_jumpPoint = std::make_tuple(a_neighbor.first, a_neighbor.second, true);
	      return 1;
	    }
	}
    }

  // the next guy to check traversing in this direction
  std::pair<int, Direction> nextNeighbor(a_neighbor.first + a_oneStepMove[a_neighbor.second], a_neighbor.second);

  return jump(a_map, nextNeighbor, a_jumpPoint, a_oneStepMove);
}