Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. struct Node {
  7.     string mark;
  8.     int* relatedVertex = new int; //0 - отсутствие дуги, любое другое неотрицательное число означает присутствие дуги и её длину
  9. };
  10.  
  11. class Graph {
  12. public:
  13.     Node* arrayOfNodes;
  14.     int sizeOfGraph = 0;
  15.  
  16.     void addNode(string mark);
  17.     void addArc(const int& weight, string mark1, string mark2);
  18.     void deleteNode(string mark);
  19.     void deleteArc(string mark1, string mark2);
  20.     void changeMark(string oldMark, string newMark);
  21.     void changeArc(const int& weight, string mark1, string mark2);
  22. };
  23.  
  24. void Graph::addNode(string mark) {
  25.     short flag = 0;
  26.     for(int i = 0; i < sizeOfGraph; ++i) {
  27.         if(arrayOfNodes[i].mark == mark)
  28.             ++flag;
  29.     }
  30.     if (!flag) {
  31.         Node* arrayOfNodes_temp = new Node[sizeof(Node)]; //Выделяем массив новго размера на 1 узел больше
  32.         arrayOfNodes_temp[sizeOfGraph].mark = mark; //Задаем имя
  33.         arrayOfNodes_temp[sizeOfGraph].relatedVertex[sizeOfGraph] = 0;
  34.         for (int i = 0; i < sizeOfGraph; ++i) {
  35.             arrayOfNodes_temp[sizeOfGraph].relatedVertex[i] = 0; //Oбнуляем массив вершин
  36.             arrayOfNodes_temp[i] = arrayOfNodes[i]; // Копируем в новый массив старые узле
  37.             int* relatedVertex_temp = new int[sizeOfGraph + 1]; //Переделываем массив дуг в каждом узле
  38.             relatedVertex_temp[sizeOfGraph] = 0;
  39.             for (int j = 0; j < sizeOfGraph; ++j) {
  40.                 relatedVertex_temp[j] = arrayOfNodes_temp[i].relatedVertex[j];
  41.             }
  42.  
  43.             delete arrayOfNodes_temp[i].relatedVertex;
  44.             arrayOfNodes_temp[i].relatedVertex = relatedVertex_temp; //Ставим указателя нового массива на место старого
  45.         }
  46.  
  47.         delete arrayOfNodes;
  48.         arrayOfNodes = arrayOfNodes_temp; //Ставим указателя нового массива на место старого
  49.         ++sizeOfGraph; //Инкрементируем размер графа
  50.     } else {
  51.         cout << "Mark is duplicated!\n";
  52.     }
  53. }
  54.  
  55. void Graph::addArc(const int& weight, string mark1, string mark2) {
  56.     short flag = 0, index1, index2;
  57.     for(int i = 0; i < sizeOfGraph; ++i) {
  58.         if(arrayOfNodes[i].mark == mark1) {
  59.             flag++;
  60.             index1 = i;
  61.         }
  62.         if(arrayOfNodes[i].mark == mark2) {
  63.             flag++;
  64.             index2 = i;
  65.         }
  66.     }
  67.     if(flag == 2) {
  68.         arrayOfNodes[index1].relatedVertex[index2] = weight;
  69.     } else {
  70.         cout << "Didn't find nodes!\n";
  71.     }
  72. }
  73.  
  74. int main() {
  75.     Graph graph;
  76.     string newMark = "a", newMark2 = "b", newMark3 = "c" , newMark4 = "d", newMark5 = "e";
  77.     graph.addNode(newMark);
  78.     graph.addNode(newMark2);
  79.     graph.addNode(newMark3);
  80.     graph.addNode(newMark4);
  81.     graph.addNode(newMark5);
  82.     for (int i = 0; i < 10; ++i) {
  83.         newMark2 += i + 81;
  84.  
  85.         graph.addNode(newMark2);
  86.     }
  87.  
  88.     graph.addArc(13, "a", "b");
  89.     graph.addArc(7, "a", "d");
  90.  
  91.     graph.addArc(2, "b", "c");
  92.  
  93.     graph.addArc(3, "c", "a");
  94.     graph.addArc(3, "c", "e");
  95.  
  96.     graph.addArc(8, "d", "a");
  97.     graph.addArc(2, "d", "b");
  98.     graph.addArc(5, "d", "c");
  99.     graph.addArc(9, "d", "e");
  100.  
  101.     graph.addArc(8, "e", "a");
  102.  
  103.     for(int i = 0; i < graph.sizeOfGraph; ++i) {
  104.         cout << graph.arrayOfNodes[i].mark << endl;
  105.         for(int j = 0; j < graph.sizeOfGraph; ++j) {
  106.             cout << graph.arrayOfNodes[i].relatedVertex[j] << " ";
  107.         }
  108.         cout << endl;
  109.     }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement