Advertisement
myloyo

1 Класс

Oct 21st, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.79 KB | None | 0 0
  1. // класс графа
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <fstream>
  7. #include <vector>
  8. #include <list>
  9. #include <map>
  10. #include <locale>
  11. #include <windows.h>
  12.  
  13. using namespace std;
  14.  
  15. class Graph {
  16. private:
  17.     map<string, map<string, int>> AdjList;
  18.     bool direct;
  19.     bool weight;
  20.  
  21. public:
  22.     Graph(map<string, map<string, int>> a, bool d, bool w) {
  23.         AdjList = a;
  24.         direct = d;
  25.         weight = w;
  26.     }
  27.  
  28.     Graph(const Graph &g) {
  29.         this->AdjList = g.AdjList;
  30.         this->direct = g.direct;
  31.         this->weight = g.weight;
  32.     }
  33.  
  34.     void operator()(const Graph &g) {
  35.         this->AdjList = g.AdjList;  
  36.         this->direct = g.direct;  
  37.         this->weight = g.weight;
  38.     }
  39.  
  40.     Graph() {
  41.         AdjList.clear();
  42.         direct = false;
  43.         weight = 0;
  44.     }
  45.  
  46.     ~Graph() {
  47.         direct = false;
  48.         weight = false;
  49.         AdjList.clear();
  50.     }
  51.  
  52.     bool GetDir() {
  53.         return this->direct;
  54.     }
  55.  
  56.     bool GetWeight() {
  57.         return this->weight;
  58.     }
  59.  
  60.     void SetDir(bool d) {
  61.         this->direct = d;
  62.     }
  63.  
  64.     void SetWeight(bool w) {
  65.         this->weight = w;
  66.     }
  67.  
  68.     bool ExistVertex(string v) {
  69.         return AdjList.find(v) != AdjList.end();
  70.     }
  71.  
  72.     bool ExistEdge(string v1, string v2) {
  73.         return AdjList.find(v1)->second.find(v2) != AdjList.find(v1)->second.end();
  74.     }
  75.  
  76.     map <string, map<string, int>> GetAdj() {
  77.         return this->AdjList;
  78.     }
  79.  
  80.     void AddVertex(string v) {
  81.         if (!ExistVertex(v)) {
  82.             map<string, int> second;
  83.             AdjList.insert({ v, second });
  84.         }
  85.         else {
  86.             cout << "Вершина уже существует" << endl;
  87.         }
  88.     }
  89.  
  90.     void AddEdge(string v1, string v2) {   //для невзвешенного
  91.         if (!ExistVertex(v1) || !ExistVertex(v2)) {
  92.             cout << "Вершин не существует\n";
  93.         }
  94.         else {
  95.             if (ExistEdge(v1, v2)) {
  96.                 cout << "Ребро уже существует!\n";
  97.             }
  98.             else {
  99.                 AdjList[v1][v2];
  100.                 if (!direct) {
  101.                     AdjList[v2][v1];
  102.                 }
  103.             }
  104.         }
  105.     }
  106.  
  107.     void AddEdge(string v1, string v2, int w) { //для взвешенного
  108.         if (!ExistVertex(v1) || !ExistVertex(v2)) {
  109.             cout << "Вершин не существует\n";
  110.         }
  111.         else {
  112.             if (ExistEdge(v1, v2)) {
  113.                 cout << "Ребро уже существует!\n";
  114.             }
  115.             else {
  116.                 AdjList[v1][v2] = w;
  117.                 if (!direct) {
  118.                     AdjList[v2][v1] = w;
  119.                 }
  120.             }
  121.         }
  122.     }
  123.  
  124.     void DeleteVertex(string v) {
  125.         if (ExistVertex(v) == false) {
  126.             cout << "Вершины не существует\n";
  127.         }
  128.         else {
  129.             for (auto& it : AdjList) {
  130.                 if (it.second.find(v) != it.second.end()) {
  131.                     it.second.erase(v);
  132.                 }
  133.             }
  134.             AdjList.erase(v);
  135.         }
  136.     }
  137.  
  138.     void DeleteEdge(string v1, string v2) {
  139.         if (ExistEdge(v1, v2)) {
  140.             map<string, map<string, int>>::iterator i;
  141.             map<string, int>::iterator j;
  142.  
  143.             i = AdjList.find(v1);
  144.             j = i->second.find(v2);
  145.             i->second.erase(j);
  146.             if (!direct) {
  147.                 AdjList.find(v2)->second.erase(v1);
  148.             }
  149.         }
  150.         else {
  151.             cout << "Ребра не существует\n";
  152.         }
  153.     }
  154.  
  155.     void PrintList() {
  156.         if (weight) {
  157.             for (auto& elem : AdjList) {
  158.                 cout << "vertex " << elem.first + ": ";
  159.                 for (auto& it : elem.second) {
  160.                     cout << it.first << " (w = " << it.second << "); ";
  161.                 }
  162.                 cout << "\n";
  163.             }
  164.             cout << "\n";
  165.         }
  166.         else {
  167.             for (auto& elem : AdjList) {
  168.                 cout << "vertex " << elem.first + ": ";
  169.                 for (auto& it : elem.second) {
  170.                     cout << it.first << "; ";
  171.                 }
  172.                 cout << "\n";
  173.             }
  174.             cout << "\n";
  175.         }
  176.     }
  177.  
  178.     void loadFromFile(string filename) {
  179.         ifstream in(filename);
  180.         if (!in.is_open()) {
  181.             throw runtime_error("Не удалось открыть файл для чтения.");
  182.         }
  183.         string dir;
  184.         in >> dir;
  185.         if (dir == "directed") {
  186.             direct = true;
  187.         }
  188.         else if (dir == "undirected") {
  189.             direct = false;
  190.         }
  191.         else {
  192.             throw runtime_error("Неверный формат файла: не указано directed или undirected\n");
  193.         }
  194.  
  195.         string type;
  196.         in >> type;
  197.         if (type == "weighted") {
  198.             weight = true;
  199.         }
  200.         else if (type == "unweighted") {
  201.             weight = false;
  202.         }
  203.         else {
  204.             throw runtime_error("Неверный формат файла: не указано weighted или unweighted\n");
  205.         }
  206.  
  207.         if (weight) {
  208.             string u, v;
  209.             int weight;
  210.             while (in >> u >> v >> weight) {
  211.                 if (!ExistVertex(u)) {
  212.                     AddVertex(u);
  213.                 }
  214.                 if (!ExistVertex(v)) {
  215.                     AddVertex(v);
  216.                 }
  217.                 AddEdge(u, v, weight);
  218.             }
  219.         }
  220.         else {
  221.             string u, v;
  222.             while (in >> u >> v) {
  223.                 if (!ExistVertex(u)) {
  224.                     AddVertex(u);
  225.                 }
  226.                 if (!ExistVertex(v)) {
  227.                     AddVertex(v);
  228.                 }
  229.                 AddEdge(u, v);
  230.             }
  231.         }
  232.     }
  233. }
  234.  
  235. #include <iostream>
  236. #include <string>
  237. #include <vector>
  238. #include <fstream>
  239. #include <vector>
  240. #include <list>
  241. #include <map>
  242. #include <locale>
  243. #include <windows.h>
  244. #include "Graph.h"
  245.  
  246. using namespace std;
  247.  
  248. int main() {
  249.     setlocale(LC_ALL, "Russian");
  250.     SetConsoleOutputCP(CP_UTF8);
  251.  
  252.     map<string, Graph> graphs;
  253.     string cur = "";
  254.  
  255.     while (true) {
  256.         cout << "\t~~Меню функций~~\n";
  257.         cout << "1. Загрузить граф из файла\n";
  258.         cout << "2. Выбрать текущий существующий граф\n";
  259.         cout << "3. Создать свой граф\n";
  260.         cout << "4. Показать список смежности текущего графа\n";
  261.         cout << "5. Добавить вершину\n";
  262.         cout << "6. Добавить ребро\n";
  263.         cout << "7. Удалить вершину\n";
  264.         cout << "8. Удалить ребро\n";
  265.         cout << "9. Копировать граф\n";
  266.         cout << "10. Выйти\n";
  267.  
  268.         int x; cout << "Выберите действие: ";  
  269.         cin >> x;
  270.         if (x == 1) {
  271.             Graph g;
  272.             cout << "Введите название файла: ";
  273.             string s; cin >> s;
  274.             ifstream in(s);
  275.             if (!in.is_open()) {
  276.                 throw runtime_error("Не удалось открыть файл для чтения.");
  277.             }
  278.             else{
  279.                 g.loadFromFile(s);
  280.                 graphs[s] = g;
  281.                 cur = s;
  282.                 cout << "\n";
  283.             }
  284.         }
  285.         else if (x == 2) {
  286.             cout << "Какой граф выбираем?\n";
  287.             for (auto i : graphs) {
  288.                 cout << i.first << "\n";
  289.             }
  290.             string s;
  291.             cin >> s;
  292.             cur = s;
  293.             cout << "Установлен текущий граф: " << s << "\n";
  294.         }
  295.         else if (x == 3) {
  296.  
  297.             Graph g1;
  298.             string c1, c2;
  299.             cout << "Граф взвешенный? ";
  300.             cin >> c1;
  301.             if (c1 == "yes" || c1 == "да") {
  302.                 g1.SetWeight(true);
  303.             }
  304.             else if (c1 == "no" || c1 == "нет") {
  305.                 g1.SetWeight(false);
  306.             }
  307.  
  308.             cout << "Граф ориентированный? ";
  309.             cin >> c2;
  310.             if (c2 == "yes" || c2 == "да") {
  311.                 g1.SetDir(true);
  312.             }
  313.             else if (c2 == "no" || c2 == "нет") {
  314.                 g1.SetDir(false);
  315.             }
  316.  
  317.             string u, v;
  318.             int w;
  319.             cout << "Вводите ребра графа, для завершения введите -1 -1 (и еще -1 если взвешенный)";
  320.             if (g1.GetWeight()) {
  321.                 while (u != "-1" and v != "-1") {
  322.                     cin >> u >> v >> w;
  323.                     if (!g1.ExistVertex(u)) {
  324.                         g1.AddVertex(u);
  325.                     }
  326.                     if (!g1.ExistVertex(v)) {
  327.                         g1.AddVertex(v);
  328.                     }
  329.                     g1.AddEdge(u, v, w);
  330.                 }
  331.             }
  332.             else {
  333.                 while (u != "-1" and v != "-1") {
  334.                     cin >> u >> v;
  335.                     if (!g1.ExistVertex(u)) {
  336.                         g1.AddVertex(u);
  337.                     }
  338.                     if (!g1.ExistVertex(v)) {
  339.                         g1.AddVertex(v);
  340.                     }
  341.                     g1.AddEdge(u, v);
  342.                 }
  343.             }
  344.  
  345.             string name;
  346.             cout << "Введите название графа: ";
  347.             cin >> name;
  348.             cur = name;
  349.             graphs[name] = g1;
  350.         }
  351.         else if (x == 4) {
  352.             cout << cur << "\n";
  353.             cout << "Список смежности для графа " << cur << "\n";
  354.             graphs[cur].PrintList();
  355.             cout << "\n";
  356.         }
  357.         else if (x == 5) {
  358.             string u;
  359.             cout << "Введите вершину: ";
  360.             cin >> u;
  361.             graphs[cur].AddVertex(u);
  362.             cout << "\n";
  363.         }
  364.         else if (x == 6) {
  365.             string u, v;
  366.             cout << "Введите вершины: ";
  367.             cin >> u >> v;
  368.             if (graphs[cur].GetWeight() == true) {
  369.                 cout << "Введите вес ребра: ";
  370.                 int w; cin >> w;
  371.                 graphs[cur].AddEdge(u, v, w);
  372.             }
  373.             else {
  374.                 graphs[cur].AddEdge(u, v);
  375.             }
  376.             cout << "\n";
  377.         }
  378.         else if (x == 7) {
  379.             string s;
  380.             cout << "Введите вершину для удаления: ";
  381.             cin >> s;
  382.             graphs[cur].DeleteVertex(s);
  383.             cout << "\n";
  384.         }
  385.         else if (x == 8) {
  386.             string u, v;
  387.             cout << "Введите ребро для удаления: ";
  388.             cin >> u >> v;
  389.             graphs[cur].DeleteEdge(u, v);
  390.         }
  391.         else if (x == 9) {
  392.             string name;
  393.             cout << "Введите имя графа, в который копируем текущий граф: ";
  394.             cin >> name;
  395.             graphs[name](graphs[cur]);
  396.             cout << "Граф успешно скопирован!\n";
  397.         }
  398.         else if (x == 10) {
  399.             cout << "Работа с графами завершена.\n";
  400.             exit(0);
  401.         }
  402.     }
  403. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement