Advertisement
rado_dimitrov66

Graph

May 29th, 2024
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. const int MAX_SIZE = 20; // Максимален брой върхове в графа
  5.  
  6. // Структура за представяне на граф
  7. struct Graph {
  8.     int key; // Матрица на съседство
  9.     Graph* next; // Брой върхове в графа
  10. } *graphArray[MAX_SIZE];
  11.  
  12. // Функция за инициализация на графа
  13. void initializeGraph() {
  14.  
  15.     for (int i = 0; i < MAX_SIZE; i++)
  16.     {
  17.         graphArray[i] = NULL;
  18.     }
  19. }
  20.  
  21. // Функция за добавяне на ребро в графа
  22. void addEdge(int u, int v) {
  23.  
  24.     for (int i = 0; i < MAX_SIZE; i++)
  25.     {
  26.         if (graphArray[i]->key == u)
  27.         {
  28.  
  29.             Graph* p = new Graph;
  30.  
  31.             p->key = v;
  32.  
  33.             p->next = graphArray[i]->next;
  34.  
  35.             graphArray[i]->next = p;
  36.  
  37.             break;
  38.         }
  39.     }
  40. }
  41.  
  42. int isVisited(int key)
  43. {
  44.     for (int i = 0; i < MAX_SIZE; i++)
  45.     {
  46.         if (graphArray[i])
  47.         {
  48.             if (graphArray[i]->key == key)
  49.             {
  50.  
  51.                 return i;
  52.  
  53.  
  54.             }
  55.  
  56.  
  57.         }
  58.     }
  59.  
  60. }
  61.  
  62. // Функция за показване на графа
  63. void display() {
  64.  
  65.     int viseted[MAX_SIZE] = { 0 };
  66.  
  67.     for (int i = 0; i < MAX_SIZE; i++)
  68.     {
  69.         if (graphArray[i] && viseted[i] == 0)
  70.         {
  71.  
  72.             cout << graphArray[i]->key << " ";
  73.  
  74.             Graph* p = graphArray[i];
  75.  
  76.             if (p->next)
  77.             {
  78.                 p = p->next;
  79.  
  80.                 while (p)
  81.                 {
  82.  
  83.                     int index = isVisited(p->key);
  84.  
  85.  
  86.                     if (viseted[index] == 0 && index != i)
  87.                     {
  88.                         cout << graphArray[index]->key << " ";
  89.  
  90.                         viseted[index] = 1;
  91.  
  92.                         viseted[i] = 1;
  93.                     }
  94.  
  95.  
  96.                     p = p->next;
  97.  
  98.                 }
  99.             }
  100.  
  101.             viseted[i] = 1;
  102.  
  103.  
  104.         }
  105.     }
  106.  
  107.  
  108. }
  109.  
  110.  
  111. bool searchNode(int key)
  112. {
  113.  
  114.     for (int i = 0; i < MAX_SIZE; i++)
  115.     {
  116.         if (graphArray[i])
  117.         {
  118.  
  119.             if (graphArray[i]->key == key)
  120.             {
  121.                 return true;
  122.             }
  123.         }
  124.     }
  125.  
  126.  
  127.     return false;
  128. }
  129.  
  130. bool searchEdge(int u, int v)
  131. {
  132.     unsigned int fEmpty = 0;
  133.  
  134.     for (int i = 0; i < MAX_SIZE; i++)
  135.     {
  136.         if (graphArray[i])
  137.         {
  138.  
  139.  
  140.             if (graphArray[i]->key == u)
  141.             {
  142.                 Graph* p = graphArray[i];
  143.  
  144.                 p = p->next;
  145.  
  146.                 while (p)
  147.                 {
  148.                     if (p->key == v)
  149.                     {
  150.                         return true;
  151.                     }
  152.                     p = p->next;
  153.  
  154.                 }
  155.             }
  156.         }
  157.     }
  158.  
  159.     return false;
  160. }
  161.  
  162. void addNode(int key)
  163. {
  164.     unsigned int fEmpty = 0;
  165.  
  166.     for (int i = 0; i < MAX_SIZE; i++)
  167.     {
  168.         if (graphArray[i] == NULL)
  169.         {
  170.             fEmpty = i;
  171.             break;
  172.         }
  173.     }
  174.  
  175.     Graph* newNode = new Graph;
  176.  
  177.  
  178.     newNode->key = key;
  179.  
  180.     newNode->next = NULL;
  181.  
  182.     graphArray[fEmpty] = newNode;
  183.  
  184.  
  185. }
  186.  
  187.  
  188. // Функция за намиране на изолирани върхове в графа
  189. void findIsolatedVertices() {
  190.  
  191.     bool isFound = false;
  192.  
  193.     for (int i = 0; i < MAX_SIZE; i++)
  194.     {
  195.         bool isInput = false;
  196.  
  197.         if (graphArray[i])
  198.         {
  199.             if (!graphArray[i]->next)
  200.             {
  201.                 for (int j = 0; j < MAX_SIZE; j++)
  202.                 {
  203.                     if (graphArray[j] && j != i)
  204.                     {
  205.                         Graph* p = graphArray[j];
  206.  
  207.                         p = p->next;
  208.  
  209.                         while (p)
  210.                         {
  211.                             if (p->key == graphArray[i]->key)
  212.                             {
  213.                                 isInput = true;
  214.                                 break;
  215.                             }
  216.  
  217.                             p = p->next;
  218.                         }
  219.                     }
  220.                 }
  221.  
  222.                 if (!isInput)
  223.                 {
  224.                     isFound = true;
  225.  
  226.                     cout << "Isolated Vertice found: " << graphArray[i]->key << endl;
  227.  
  228.                 }
  229.             }
  230.         }
  231.  
  232.  
  233.     }
  234.  
  235.     if (!isFound)
  236.     {
  237.         cout << "No isolated vertices found\n";
  238.     }
  239.  
  240. }
  241.  
  242. void mainMenu() {
  243.     cout << "\nMenu:\n";
  244.     cout << "1. Add node\n";
  245.     cout << "2. Add edge\n";
  246.     cout << "3. Print all elements\n";
  247.     cout << "4. Find Isolated Vertices\n";
  248.     cout << "5. Exit\n";
  249. }
  250.  
  251. int main() {
  252.  
  253.  
  254.     initializeGraph(); // Инициализира графа с въведения брой върхове
  255.  
  256.     int choice, u, v, counter = 0;
  257.  
  258.  
  259.     while (true) {
  260.         mainMenu(); // Показва менюто
  261.         cout << "Choose option: ";
  262.         cin >> choice;
  263.  
  264.         switch (choice) {
  265.  
  266.         case 1:
  267.             // Въвежда връх
  268.             cout << "Enter node: ";
  269.             cin >> u;
  270.  
  271.             if (!searchNode(u) && counter < MAX_SIZE)
  272.             {
  273.                 addNode(u);
  274.  
  275.                 counter++;
  276.  
  277.             }
  278.             else if (counter >= MAX_SIZE)
  279.             {
  280.                 cout << "Graph is full\n";
  281.             }
  282.             else
  283.             {
  284.                 cout << "Node already exist\n";
  285.             }
  286.  
  287.             break;
  288.  
  289.         case 2:
  290.             // Въвежда ребро между два върха
  291.             cout << "Enter start node: ";
  292.             cin >> u;
  293.             cout << "Enter end node: ";
  294.             cin >> v;
  295.  
  296.  
  297.             if (searchEdge(u, v))
  298.             {
  299.                 cout << "Rainbow already exist\n";
  300.             }
  301.             else
  302.             {
  303.                 bool isInvalid = false;
  304.  
  305.                 if (!searchNode(u) && counter < MAX_SIZE)
  306.                 {
  307.                     addNode(u);
  308.                 }
  309.                 else {
  310.                     cout << "No space";
  311.  
  312.                     isInvalid = true;
  313.                 }
  314.  
  315.                 if (!searchNode(v) && counter < MAX_SIZE)
  316.                 {
  317.                     addNode(v);
  318.  
  319.                 }
  320.                 else {
  321.                     cout << "No space";
  322.  
  323.                     isInvalid = true;
  324.                 }
  325.  
  326.                 if (!isInvalid)
  327.                 {
  328.                     addEdge(u, v);
  329.                 }
  330.  
  331.  
  332.             }
  333.  
  334.             break;
  335.         case 3:
  336.             // Показва графа
  337.             display();
  338.             break;
  339.         case 4:
  340.             // Намира и показва изолираните върхове
  341.             findIsolatedVertices();
  342.             break;
  343.         case 5:
  344.             // Излиза от програмата
  345.             cout << "Exit.\n";
  346.             return 0;
  347.         default:
  348.             // Показва съобщение за невалидна опция
  349.             cout << "Invalid option. Try again.\n";
  350.             break;
  351.         }
  352.     }
  353.  
  354.     return 0;
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement