node *current_node;

  push_front(que, start_node);

  used[start_node->uid] = 1;

  cursor = que->tail;

  while (que->tail) {

  current_node = pop_back(que);

  if (current_node)

  if (current_node->output_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  aux_pointer = current_node->output_pointer->aux_elem_pointer;

  while (aux_pointer!= NULL) {

  if (aux_pointer->arc_pointer->aux_elem_input_pointer)

  if (aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer)

  if (aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer)

  if (used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0) {

  used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] = 1;

  push_front(que, aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer);

  }

  aux_pointer = aux_pointer->next;

  }

  }

  for (int i = 0; i < used_counter; i++)

  if (used[i] == 0) {

  result = 0;

  break;

  }

  destroy_que(que);

  return result;

}

/*

* Определяет количество компонент связности.

*/

int find_num_conponents(graph *g) {

  // Если граф изначально связный, то число компонент равно 1.

НЕ нашли? Не то? Что вы ищете?

  int result = 1; 

  int number_of_components = 0;

  int used_counter = g->number_of_nodes;

  int used[MAX_ELEM];

  memset(used, 0, sizeof (used));

  node *cursor;

  aux_elem_arc *aux_pointer = NULL;

  queue *que;

  que = (queue *) malloc(sizeof (queue));

  init_que(que);

  node *current_node;

  for (int i = 0; i < used_counter; i++) {

  if (used[i] == 0) {

  destroy_que(que);

  init_que(que);

  current_node = g->node_pointer;

  while (current_node->uid!= i)

  current_node = current_node->next;

  push_front(que, current_node);

  used[i] = 1;

  cursor = que->tail;

  while (que->tail) {

  current_node = pop_back(que);

  if (current_node)

  if (current_node->output_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  aux_pointer = current_node->output_pointer->aux_elem_pointer;

  while (aux_pointer!= NULL) {

  if (aux_pointer->arc_pointer)

  if (aux_pointer->arc_pointer->aux_elem_input_pointer)

  if (used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0) //Вершина не посещалась

  {

  used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] = 1; //Отмечаем её как посещённую 

  push_front(que, aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer); //И помещаем в очередь

  }

  aux_pointer = aux_pointer->next;

  }

  }

  for (int i = 1; i <= used_counter; i++)

  //for (int i = 1; i < used_counter; i++)

  if (used[i] == 0) {

  //result = 0;

  number_of_components += 1;

  break;

  }

  }

  }

  if (number_of_components > 1)

  return number_of_components;

  else

  return result;

}

/*

* Определяет рёберную связность графа.

*/

int find_rib_relations(graph *g) {

  int result = -1;

  int global_result = ABSOLUTE_MAX;

  int ways_number = 0;

  int way_free = 1;

  int prv;

  int enffl_finded = 0;

  int used[RIB_SIZE] = {0};

  int checked[RIB_SIZE][RIB_SIZE] = {0};

  int prev[RIB_SIZE] = {0};

  node *source, *effluent;

  output *current_output;

  source = g->node_pointer;

  effluent = source->next;

  aux_elem_arc *aux_pointer = NULL;

  queue *que;

  que = (queue *) malloc(sizeof (queue));

  init_que(que);

  node *current_node;

  while (source) {

  while (effluent) {

  while (way_free == 1) {

  init_que(que);

  push_front(que, source);

  used[source->uid] = 1;

  enffl_finded = 0;

  while (enffl_finded == 0 && que->tail!= NULL) {

  current_node = pop_back(que);

  if (current_node)

  if (current_node->output_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  if (current_node->output_pointer->aux_elem_pointer)

  aux_pointer = current_node->output_pointer->aux_elem_pointer;

  while (aux_pointer!= NULL) {

  if (aux_pointer->arc_pointer->aux_elem_input_pointer)

  if (used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0)

  if (checked[current_node->uid][aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0) {

  used[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] = 1;

  prev[aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] = current_node->uid;

  if (aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer == effluent)

  enffl_finded = 1;

  push_front(que, aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer);

  }

  aux_pointer = aux_pointer->next;

  }

  }

  if (enffl_finded == 1) {

  prv = effluent->uid;

  while (prv!= source->uid) {

  checked[prv][prev[prv]] = 1;

  checked[prev[prv]][prv] = 1;

  prv = prev[prv];

  }

  current_output = source->output_pointer;

  way_free = 0;

  while (current_output!= NULL) {

  if (current_output->aux_elem_pointer) {

  aux_pointer = current_output->aux_elem_pointer;

  while (aux_pointer) {

  if (aux_pointer->arc_pointer->aux_elem_input_pointer)

  if (checked[source->uid]

  [aux_pointer->arc_pointer->aux_elem_input_pointer->input_pointer->node_pointer->uid] == 0)

  way_free = 1;

  aux_pointer = aux_pointer->next;

  }

  }

  current_output = current_output->next;

  }

  ways_number += 1;

  if (ways_number >= result)

  result = ways_number;

  } else

  way_free = 0;

  init_que(que);

  memset(used, 0, sizeof (used));

  memset(prev, 0, sizeof (prev));

  }

  if (result <= global_result)

  global_result = result;

  memset(checked, 0, sizeof (checked));

  ways_number = 0;

  result = -1;

  way_free = 1;

  enffl_finded = 0;

  effluent = effluent->next;

  }

  source = source->next;

  if (source)

  effluent = source->next;

  } 

  return global_result;

}

/*

* Определяет вершинную связность графа.

*/

int find_node_relations(graph* g) {

  graph *graph_copy, *work;

  node *head, *current_node, *vs_node_inp, *vs_node_out, *new_node_list, *work_new_node_list;

  arc *new_arc, *head_arc, *current_arc;

  aux_elem_arc *current_aux_elem_out, *new_aux_out;

  aux_elem_arc *current_aux_elem_inp, *new_aux_inp;

  aux_elem_input *inp_for_arc;

  aux_elem_output *out_for_arc;

  input *new_input;

  output *new_output;

  // work - это исходный граф.

  work = g;

  // graph_copy - копия исходного графа. Которую преобразуем.

  graph_copy = copy_graph(work);

  int first_time = 1;

  int uid_index = 0;

  head = graph_copy->node_pointer;

  head_arc = graph_copy->arc_pointer;

  current_node = head;

  current_arc = head_arc;

  while (current_node!= NULL) {

  vs_node_inp = (node *) malloc(sizeof (node));

  vs_node_out = (node *) malloc(sizeof (node));

  vs_node_inp->prev = NULL;

  vs_node_inp->next = vs_node_out;

  vs_node_out->prev = vs_node_inp;

  vs_node_out->next = NULL;

  strcpy(vs_node_inp->name, "");

  strcat(vs_node_inp->name, current_node->name);

  strcat(vs_node_inp->name, current_node->input_pointer->name);

  strcat(vs_node_inp->name, "1");

  strcpy(vs_node_out->name, "");

  strcat(vs_node_out->name, current_node->name);

  strcat(vs_node_out->name, current_node->output_pointer->name);

  strcat(vs_node_out->name, "2");

  vs_node_inp->number_of_inputs = current_node->number_of_inputs;

  vs_node_inp->number_of_outputs = 1;

  vs_node_out->number_of_outputs = current_node->number_of_outputs;

  vs_node_out->number_of_inputs = 1;

  new_input = (input *) malloc(sizeof (input));

  new_input->node_pointer = vs_node_out;

  strcpy(new_input->name, "");

  strcat(new_input->name, "inp");

  strcat(new_input->name, vs_node_out->name);

  vs_node_out->input_pointer = new_input;

  new_output = (output *) malloc(sizeof (output));

  new_output->node_pointer = vs_node_inp;

  strcpy(new_output->name, "");

  strcat(new_output->name, "out");

  strcat(new_output->name, vs_node_inp->name);

  vs_node_inp->output_pointer = new_output;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9