Esempio n. 1
0
/*!
  \param[in] pred The node preceding this node (in the path).
  \param[in] cargoLimit The cargo limit of the vehicle.
  */
void
Vehicle_node::evaluate(const Vehicle_node &pred, double cargoLimit) {
    /* time */
    m_travel_time    = pred.travel_time_to(*this);
    m_arrival_time   = pred.departure_time() + travel_time();
    m_wait_time      = is_early_arrival(arrival_time()) ?
                       opens() - m_arrival_time :
                       0;
    m_departure_time = arrival_time() + wait_time() + service_time();

    /* time aggregates */
    m_tot_travel_time = pred.total_travel_time() + travel_time();
    m_tot_wait_time    = pred.total_wait_time()    + wait_time();
    m_tot_service_time = pred.total_service_time() + service_time();

    /* cargo aggregates */
    if (is_dump() &&  pred.cargo() >= 0) {
        m_demand = -pred.cargo();
    }
    m_cargo = pred.cargo() + demand();

    /* cargo aggregates */

    m_twvTot = has_twv() ? pred.twvTot() + 1 : pred.twvTot();
    m_cvTot = has_cv(cargoLimit) ? pred.cvTot() + 1 : pred.cvTot();
    m_delta_time = departure_time() - pred.departure_time();
}
Esempio n. 2
0
void dotestcase() {
  unsigned int N;
  scanf("%u", &N);
  VE edges(2 * N - 2);
  VVU out_adj(N);
  for (unsigned int i1 = 0; i1 < N - 1; ++i1) {
    unsigned int temp1, temp2;
    scanf("%u", &temp1);
    scanf("%u", &temp2);
    edges[2 * i1].src = temp1;
    edges[2 * i1].dst = temp2;
    edges[2 * i1 + 1].src = temp2;
    edges[2 * i1 + 1].dst = temp1;
    out_adj[temp1 - 1].push_back(2 * i1);
    out_adj[temp2 - 1].push_back(2 * i1 + 1);
  }
  marked_uint_stack s;
  VB dfs_seen(N, false);
  VU subtree_size(N);
  VU departure_time(N);
  s.push(marked_uint(false, 1)); //node number 1 becomes root of
				 //dfs_tree.
  dfs_seen[1 - 1] = true;
  unsigned int departure_counter = 0;
  while (!s.empty()) {
    marked_uint current = s.top();
    s.pop();
    if (current.first) {
      departure_time[current.second - 1] = ++departure_counter;
      subtree_size[current.second - 1] = 1;
      for (unsigned int i1 = 0; i1 < out_adj[current.second - 1].size(); ++i1) {
	edge &e1 = edges[out_adj[current.second - 1][i1]];
	edge &e2 = (out_adj[current.second - 1][i1] % 2 > 0) ? edges[out_adj[current.second - 1][i1] - 1] : edges[out_adj[current.second - 1][i1] + 1];
	assert(current.second == e1.src);
	if (departure_time[current.second - 1] > departure_time[e1.dst - 1]) {
	  subtree_size[current.second - 1] += subtree_size[e1.dst - 1];
	  e1.src_size = N - subtree_size[e1.dst - 1];
	  e1.dst_size = subtree_size[e1.dst - 1];
	  e2.dst_size = N - subtree_size[e1.dst - 1];
	  e2.src_size = subtree_size[e1.dst - 1];
	}
      }
    } else {
      current.first = true;
      s.push(current);
      for (unsigned int i1 = 0; i1 < out_adj[current.second - 1].size(); ++i1) {
	assert(current.second == edges[out_adj[current.second - 1][i1]].src);
	if (!dfs_seen[edges[out_adj[current.second - 1][i1]].dst - 1]) {
	  s.push(marked_uint(false, edges[out_adj[current.second - 1][i1]].dst));
	  dfs_seen[edges[out_adj[current.second - 1][i1]].dst - 1] = true;
	}
      }
    }
  }
  unsigned int opt_i1, opt = UINT_MAX;
  for (unsigned int i1 = 1; i1 <= N; ++i1) {
    unsigned int opt_for_i1 = 0;
    unsigned int remainder_i1 = N - 1;
    for (unsigned int i2 = 0; i2 < out_adj[i1 - 1].size(); ++i2) {
      edge &e1 = edges[out_adj[i1 - 1][i2]];
      if (departure_time[i1 - 1] > departure_time[e1.dst - 1]) {
	if (opt_for_i1 < subtree_size[e1.dst - 1]) {
	  opt_for_i1 = subtree_size[e1.dst - 1];
	}
	remainder_i1 -= subtree_size[e1.dst - 1];
      }
    }
    if (opt_for_i1 < remainder_i1) {
      opt_for_i1 = remainder_i1;
    }
    if (opt > opt_for_i1) {
      opt = opt_for_i1;
      opt_i1 = i1;
    }
  }
  printf("%u %u \n", opt_i1, opt);
}