Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.03 KB | None | 0 0
  1. extern "C" {
  2. #include "sc_memory_headers.h"
  3. #include "sc_helper.h"
  4. #include "utils.h"
  5. }
  6.  
  7. #include <stdio.h>
  8. #include <iostream>
  9. #include <glib.h>
  10. #include <unistd.h>
  11. #include <assert.h>
  12. #include <vector>
  13. #include <algorithm>
  14. #include <queue>
  15.  
  16. using namespace std;
  17.  
  18. sc_memory_context *context;
  19.  
  20. sc_addr graph, rrel_arcs, rrel_nodes, visit, curr_vertex, father;
  21.  
  22. sc_bool set_is_not_empty(sc_addr set)
  23. {
  24.     sc_iterator3 *check = sc_iterator3_f_a_a_new(context,
  25.                                                  set,
  26.                                                  sc_type_arc_pos_const_perm,
  27.                                                  0);
  28.     if (SC_TRUE == sc_iterator3_next(check)) {
  29.         return SC_TRUE;
  30.     } else {
  31.  
  32.         return SC_FALSE;
  33.     }
  34. }
  35.  
  36. sc_bool find_vertex_in_set(sc_addr element, sc_addr set)
  37. {
  38.     sc_bool find = SC_FALSE;
  39.  
  40.     sc_iterator3 *location = sc_iterator3_f_a_a_new(context,
  41.                                                     set,
  42.                                                     sc_type_arc_pos_const_perm,
  43.                                                     0);
  44.  
  45.     while (SC_TRUE == sc_iterator3_next(location)) {
  46.         sc_addr loc = sc_iterator3_value(location, 2);
  47.  
  48.         if (SC_ADDR_IS_NOT_EQUAL(loc, element)) {
  49.             find = SC_FALSE;
  50.             continue;
  51.         } else {
  52.             find = SC_TRUE;
  53.             break;
  54.         }
  55.     }
  56.     return find;
  57. }
  58.  
  59. void get_edge_vertexes(sc_addr edge, sc_addr &v1, sc_addr &v2)
  60. {
  61.     sc_memory_get_arc_begin(context, edge, &v1);
  62.     sc_memory_get_arc_end(context, edge, &v2);
  63. }
  64.  
  65. void print_graph()
  66. {
  67.     sc_addr arcs, nodes, loc, v1, v2, printed_vertex;
  68.     sc_bool find;
  69.     printed_vertex = sc_memory_node_new(context, sc_type_const);
  70.  
  71.     printEl(context, graph);
  72.     cout << endl << "----------------------" << endl;
  73.  
  74.     sc_iterator5 *it = sc_iterator5_f_a_a_a_f_new(context,
  75.                                                   graph,
  76.                                                   sc_type_arc_pos_const_perm,
  77.                                                   0,
  78.                                                   sc_type_arc_pos_const_perm,
  79.                                                   rrel_arcs);
  80.  
  81.     if (SC_TRUE == sc_iterator5_next(it)) {
  82.         arcs = sc_iterator5_value(it, 2);
  83.  
  84.         sc_iterator3 *arcs_it = sc_iterator3_f_a_a_new(context,
  85.                                                        arcs,
  86.                                                        sc_type_arc_pos_const_perm,
  87.                                                        0);
  88.  
  89.         while (SC_TRUE == sc_iterator3_next(arcs_it)) {
  90.  
  91.             sc_addr t_arc = sc_iterator3_value(arcs_it, 2);
  92.  
  93.             get_edge_vertexes(t_arc, v1, v2);
  94.  
  95.             printEl(context, v1);
  96.             printf(" — ");
  97.             printEl(context, v2);
  98.             cout << endl;
  99.  
  100.             if (SC_FALSE == find_vertex_in_set(v1, printed_vertex))
  101.                 sc_memory_arc_new(context, sc_type_arc_pos_const_perm, printed_vertex, v1);
  102.             if (SC_FALSE == find_vertex_in_set(v2, printed_vertex))
  103.                 sc_memory_arc_new(context, sc_type_arc_pos_const_perm, printed_vertex, v2);
  104.         }
  105.         sc_iterator3_free(arcs_it);
  106.     }
  107.  
  108.     sc_iterator5_free(it);
  109.  
  110.     it = sc_iterator5_f_a_a_a_f_new(context,
  111.                                     graph,
  112.                                     sc_type_arc_pos_const_perm,
  113.                                     0,
  114.                                     sc_type_arc_pos_const_perm,
  115.                                     rrel_nodes);
  116.  
  117.     if (SC_TRUE == sc_iterator5_next(it)) {
  118.         nodes = sc_iterator5_value(it, 2);
  119.  
  120.         sc_iterator3 *nodes_it = sc_iterator3_f_a_a_new(context,
  121.                                                         nodes,
  122.                                                         sc_type_arc_pos_const_perm,
  123.                                                         0);
  124.  
  125.         while (SC_TRUE == sc_iterator3_next(nodes_it)) {
  126.  
  127.             sc_addr t_node = sc_iterator3_value(nodes_it, 2);
  128.  
  129.             find = find_vertex_in_set(t_node, printed_vertex);
  130.  
  131.             if (find == SC_FALSE) {
  132.                 printEl(context, t_node);
  133.                 cout << endl;
  134.             }
  135.         }
  136.         sc_iterator3_free(nodes_it);
  137.     }
  138.     sc_iterator5_free(it);
  139. }
  140.  
  141. bool dfs(sc_addr vertex, bool side, sc_addr arcs, sc_addr green, sc_addr red) {
  142.     if (side)
  143.         sc_memory_arc_new(context, sc_type_arc_pos_const_perm, green, vertex);
  144.     else
  145.         sc_memory_arc_new(context, sc_type_arc_pos_const_perm, red, vertex);
  146.  
  147.  
  148.     sc_iterator5* it_vertex = sc_iterator5_f_a_a_a_f_new(context,
  149.                                                          vertex,
  150.                                                          sc_type_arc_common,
  151.                                                          0,
  152.                                                          sc_type_arc_pos_const_perm,
  153.                                                          arcs);
  154.  
  155.     while (SC_TRUE == sc_iterator5_next(it_vertex)) {
  156.         sc_addr adjacent = sc_iterator5_value(it_vertex, 2);
  157.  
  158.         bool isRed = sc_helper_check_arc(context, red, adjacent, sc_type_arc_pos_const_perm);
  159.         bool isGreen = sc_helper_check_arc(context, green, adjacent, sc_type_arc_pos_const_perm);
  160.  
  161.         if (!isRed && !isGreen) {
  162.             bool res = dfs(adjacent, !side, arcs, green, red);
  163.  
  164.             if (res) return res;
  165.         } else if ((isRed && !side) || (isGreen && side)) {
  166.             return true;
  167.         }
  168.     }
  169.  
  170.     sc_iterator5_free(it_vertex);
  171.  
  172.     return false;
  173. }
  174.  
  175. bool isGraphBipartite(sc_addr beg_vertex)
  176. {
  177.     sc_addr green = sc_memory_node_new(context, sc_type_const);
  178.     sc_addr red = sc_memory_node_new(context, sc_type_const);
  179.  
  180.     sc_iterator5 *arcs = sc_iterator5_f_a_a_a_f_new(context,
  181.                                                     graph,
  182.                                                     sc_type_arc_pos_const_perm,
  183.                                                     0,
  184.                                                     sc_type_arc_pos_const_perm,
  185.                                                     rrel_arcs);
  186.  
  187.     sc_iterator5_next(arcs);
  188.  
  189.     sc_addr allArcs = sc_iterator5_value(arcs, 2);
  190.  
  191.     sc_iterator5_free(arcs);
  192.  
  193.     bool result = !dfs(beg_vertex, false, allArcs, green, red);
  194.  
  195.  
  196.  
  197.     return result;
  198. }
  199.  
  200. void run_test(char number_test, sc_char *beg_vertex)
  201. {
  202.     sc_addr beg;
  203.     father = sc_memory_node_new(context, sc_type_const);
  204.  
  205.     char gr[3] = "Gx";
  206.     gr[1] = number_test;
  207.     sc_helper_resolve_system_identifier(context, gr, &graph);
  208.     sc_helper_resolve_system_identifier(context, "rrel_arcs", &rrel_arcs);
  209.     sc_helper_resolve_system_identifier(context, "rrel_nodes", &rrel_nodes);
  210.     sc_helper_resolve_system_identifier(context, beg_vertex, &beg);
  211.  
  212.     cout << "Graph: ";
  213.  
  214.     //print_graph();
  215.  
  216.     cout <<"Check graph"<<endl;
  217.     bool isBipartite = isGraphBipartite(beg);
  218.  
  219.     if (isBipartite) {
  220.         cout<<"Graph is bipartite";
  221.     } else {
  222.         cout << "Graph is not bipartite " << endl;
  223.     }
  224.  
  225.     cout << endl;
  226.     sc_memory_element_free(context, father);
  227. }
  228.  
  229. int main()
  230. {
  231.     sc_memory_params params;
  232.  
  233.     sc_memory_params_clear(&params);
  234.     params.repo_path = "/home/wcobalt/Files/BSUIR/ostis/kb.bin";
  235.     params.config_file = "/home/wcobalt/Files/BSUIR/ostis/config/sc-web.ini";
  236.     params.ext_path = "/home/wcobalt/Files/BSUIR/ostis/sc-machine/bin/extensions";
  237.     params.clear = SC_FALSE;
  238.  
  239.     sc_memory_initialize(&params);
  240.  
  241.     context = sc_memory_context_new(sc_access_lvl_make_max);
  242.  
  243. //////////////////////////////////////////////////////////////////////////////////
  244.     run_test('2', (sc_char *)"V1");
  245. /*    run_test('1', (sc_char *)"V1");
  246.     run_test('2', (sc_char *)"V1");
  247.     run_test('3', (sc_char *)"V1");
  248.     run_test('4', (sc_char *)"V5");*/
  249.     cout << "The end" << endl;
  250.  
  251.     sc_memory_context_free(context);
  252.  
  253.     sc_memory_shutdown(SC_TRUE);
  254.  
  255.     return 0;
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement