示例#1
0
int main() {
  
  igraph_t g;
  igraph_vector_t edges;
  igraph_vector_t vids;
  igraph_integer_t class;
  
  igraph_vector_init_int_end(&edges, -1, 
			     0,1, 1,3, 1,4, 1,6, 3,1,
			     4,1, 4,2, 6,4, 6,5, 7,8,
			     8,7, 7,9, 9,7, 8,9, 9,8,
			     -1);
  igraph_create(&g, &edges, 0, IGRAPH_DIRECTED);
  igraph_vector_destroy(&edges);
  
  igraph_vector_init_int_end(&vids, -1, 1,4,6, -1);
  igraph_isoclass_subgraph(&g, &vids, &class);
  printf("class: %i\n", (int)class);
  igraph_vector_destroy(&vids);

  igraph_vector_init_int_end(&vids, -1, 0,1,3, -1);
  igraph_isoclass_subgraph(&g, &vids, &class);
  printf("class: %i\n", (int)class);
  igraph_vector_destroy(&vids);

  igraph_vector_init_int_end(&vids, -1, 7,8,9, -1);
  igraph_isoclass_subgraph(&g, &vids, &class);
  printf("class: %i\n", (int)class);
  igraph_vector_destroy(&vids);

  igraph_vector_init_int_end(&vids, -1, 0,2,5, -1);
  igraph_isoclass_subgraph(&g, &vids, &class);
  printf("class: %i\n", (int)class);
  igraph_vector_destroy(&vids);
  
  igraph_destroy(&g);
  return 0;
}
int main() {
  igraph_t g;
  igraph_vector_t weights, result;
  igraph_bool_t dag;
  int retval;

  igraph_vector_init(&result, 0);

  igraph_set_error_handler(&igraph_error_handler_printignore);

  /***********************************************************************/
  /* Exact solution with integer programming                             */
  /***********************************************************************/

  /* Simple unweighted graph */
  igraph_small(&g, 0, IGRAPH_DIRECTED, 0,1, 1,2, 2,0, 2,3, 2,4, 0,4, 4,3, 5,0, 6,5, -1);
  retval = igraph_feedback_arc_set(&g, &result, 0, IGRAPH_FAS_EXACT_IP);
  if (retval == IGRAPH_UNIMPLEMENTED)
    return 77;
  igraph_vector_print(&result);
  igraph_delete_edges(&g, igraph_ess_vector(&result));
  igraph_is_dag(&g, &dag);
  if (!dag)
    return 1;
  igraph_destroy(&g);

  /* Simple weighted graph */
  igraph_small(&g, 0, IGRAPH_DIRECTED, 0,1, 1,2, 2,0, 2,3, 2,4, 0,4, 4,3, 5,0, 6,5, -1);
  igraph_vector_init_int_end(&weights, -1, 1, 1, 3, 1, 1, 1, 1, 1, 1, -1);
  igraph_feedback_arc_set(&g, &result, &weights, IGRAPH_FAS_EXACT_IP);
  igraph_vector_print(&result);
  igraph_delete_edges(&g, igraph_ess_vector(&result));
  igraph_is_dag(&g, &dag);
  if (!dag)
    return 2;
  igraph_vector_destroy(&weights);
  igraph_destroy(&g);

  /* Simple unweighted graph with loops */
  igraph_small(&g, 0, IGRAPH_DIRECTED, 0,1, 1,2, 2,0, 2,3, 2,4, 0,4, 4,3, 5,0, 6,5, 1,1, 4,4, -1);
  igraph_feedback_arc_set(&g, &result, 0, IGRAPH_FAS_EXACT_IP);
  igraph_vector_print(&result);
  igraph_delete_edges(&g, igraph_ess_vector(&result));
  igraph_is_dag(&g, &dag);
  if (!dag)
    return 3;
  igraph_destroy(&g);

  /* Disjoint union of two almost identical graphs */
  igraph_small(&g, 0, IGRAPH_DIRECTED,
      0,1, 1,2, 2,0, 2,3,  2,4,  0,4,  4,3,    5,0,  6,5, 1,1, 4,4,
      7,8, 8,9, 9,7, 9,10, 9,11, 7,11, 11,10, 12,7, 13,12,
      -1);
  igraph_feedback_arc_set(&g, &result, 0, IGRAPH_FAS_EXACT_IP);
  igraph_vector_print(&result);
  igraph_delete_edges(&g, igraph_ess_vector(&result));
  igraph_is_dag(&g, &dag);
  if (!dag)
    return 4;
  igraph_destroy(&g);

  /* Graph with lots of isolated vertices */
  igraph_small(&g, 10000, IGRAPH_DIRECTED, 0,1, -1);
  igraph_feedback_arc_set(&g, &result, 0, IGRAPH_FAS_EXACT_IP);
  igraph_vector_print(&result);
  igraph_delete_edges(&g, igraph_ess_vector(&result));
  igraph_is_dag(&g, &dag);
  if (!dag)
    return 5;
  igraph_destroy(&g);

  igraph_vector_destroy(&result);

  return 0;
}
int main() {
  igraph_t g, extd_g;
  igraph_matrix_t coords;
  igraph_vector_t edgelist, extd_edgelist, extd_to_orig_eids;
  igraph_vector_t layers;

  igraph_matrix_init(&coords, 0, 0);
  igraph_vector_init(&extd_to_orig_eids, 0);

  /* Layout on simple graph with predefined layers */
  igraph_vector_init_int_end(&layers, -1, 0,1,1,2,3,3,4,4,5, -1);
  igraph_vector_init_int_end(&edgelist, -1,
          0,1, 0,2, 0,3, 1,2, 2,2, 1,4, 2,5, 4,6, 5,7, 6,8, 7,8,
          3,8, 8,1, 8,2, -1);
  igraph_create(&g, &edgelist, 0, 1);

  igraph_layout_sugiyama(&g, &coords, 0, 0, &layers,
          /* hgap = */ 1,
          /* vgap = */ 1,
          /* maxiter = */ 100,
          /* weights = */ 0);
  igraph_matrix_print(&coords);
  printf("===\n");

  /* Same, but this time also return the extended graph */
  igraph_layout_sugiyama(&g, &coords, &extd_g, &extd_to_orig_eids, &layers,
          /* hgap = */ 1,
          /* vgap = */ 1,
          /* maxiter = */ 100,
          /* weights = */ 0);
  igraph_matrix_print(&coords);
  printf("===\n");
  igraph_vector_init(&extd_edgelist, 0);
  igraph_get_edgelist(&extd_g, &extd_edgelist, 0);
  igraph_vector_print(&extd_edgelist);
  igraph_vector_destroy(&extd_edgelist);
  igraph_destroy(&extd_g);
  printf("===\n");
  igraph_vector_print(&extd_to_orig_eids);
  printf("===\n");

  igraph_vector_destroy(&layers);

  /* Same, but with automatic layering */
  igraph_layout_sugiyama(&g, &coords, 0, 0, 0,
          /* hgap = */ 1,
          /* vgap = */ 1,
          /* maxiter = */ 100,
          /* weights = */ 0);
  igraph_matrix_print(&coords);
  printf("===\n");

  /* Layering with gaps in it */
  igraph_vector_init_int_end(&layers, -1, 0,2,2,4,6,6,12,12,15, -1);
  igraph_layout_sugiyama(&g, &coords, 0, 0, &layers,
          /* hgap = */ 1,
          /* vgap = */ 1,
          /* maxiter = */ 100,
          /* weights = */ 0);
  igraph_matrix_print(&coords);
  igraph_vector_destroy(&layers);
  printf("===\n");

  igraph_vector_destroy(&edgelist);
  igraph_matrix_destroy(&coords);
  igraph_vector_destroy(&extd_to_orig_eids);
  igraph_destroy(&g);

  return 0;
}