Advertisement
Tvor0zhok

Графы каркас

Oct 20th, 2022 (edited)
850
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.85 KB | None | 0 0
  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. // GOOGLE DRIVE: https://drive.google.com/drive/folders/1eNXlQ50LanvYKPj_qr-Qr2qJmPa2o_Ze?usp=sharing //
  3. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  4.  
  5. ///////////////////////////////////
  6. //            Graph.h            //
  7. ///////////////////////////////////
  8.  
  9. #pragma once
  10. #include <algorithm>
  11. #include <iostream>
  12. #include <iomanip>
  13. #include <fstream>
  14. #include <utility>
  15. #include <vector>
  16. #include <queue>
  17. #include <map>
  18. using namespace std;
  19.  
  20. /// <summary>
  21. /// Граф
  22. /// </summary>
  23. /// <typeparam name="Vertice"> тип вершин графа </typeparam>
  24. /// <typeparam name="Edge"> тип ребер графа (int по умолчанию) </typeparam>
  25. template <class Vertice, class Edge = int>
  26. class Graph
  27. {
  28.     /// <summary>
  29.     /// Количество вершин и ребер в графе
  30.     /// </summary>
  31.     int _N = 0, _M = 0;
  32.  
  33.     /// <summary>
  34.     /// Критерий ориентированности и взвешенности графа
  35.     /// </summary>
  36.     bool IsDirected = false, IsWeighted = false;
  37.  
  38.     /// <summary>
  39.     /// Список смежности графа
  40.     /// </summary>
  41.     map <Vertice, map<Vertice, Edge>> graph;
  42.  
  43. public:
  44.  
  45.     /// <summary>
  46.     /// Конструктор по умолчанию
  47.     /// </summary>
  48.     Graph() {};
  49.  
  50.     /// <summary>
  51.     /// Конструктор, создающий пустой граф, определяющий
  52.     /// ориентированность и взвешенность графа
  53.     /// </summary>
  54.     /// <param name="direction"> критерий ориентированности </param>
  55.     /// <param name="weighting"> критерий взвешенности </param>
  56.     Graph(string direction, string weighting)
  57.     {
  58.         if (direction == "directed") IsDirected = true;
  59.         if (weighting == "weighted") IsWeighted = true;
  60.     }
  61.  
  62.     /// <summary>
  63.     /// Конструктор, считывающий информацию из файла
  64.     /// или из консоли (stdin)
  65.     /// </summary>
  66.     /// <param name="filePath"> путь к файлу или ключевое слово stdin </param>
  67.     Graph(string filePath)
  68.     {
  69.         ifstream fin;
  70.  
  71.         if (filePath == "stdin") fin = ifstream(stdin);
  72.         else fin = ifstream(filePath);
  73.  
  74.         string cmd, direction, weighting;
  75.         fin >> cmd >> direction >> weighting;
  76.  
  77.         *this = Graph(direction, weighting);
  78.  
  79.         fin >> cmd >> _N;
  80.  
  81.         for (int i = 0; i < _N; ++i)
  82.         {
  83.             Vertice v; fin >> v;
  84.             graph.insert(pair<Vertice, map<Vertice, Edge>>(v, map<Vertice, Edge>()));
  85.         }
  86.  
  87.         fin >> cmd >> _M;
  88.  
  89.         for (int i = 0; i < _M; ++i)
  90.         {
  91.             Vertice u, v; Edge w; fin >> u >> v;
  92.  
  93.             if (!IsWeighted) w = 1;
  94.             else fin >> w;
  95.  
  96.             graph[u].insert(pair<Vertice, Edge>(v, w));
  97.             if (!IsDirected) graph[v].insert(pair<Vertice, Edge>(u, w));
  98.         }
  99.  
  100.         if (filePath != "stdin") fin.close();
  101.     }
  102.  
  103.     /// <summary>
  104.     /// Количество вершин графа
  105.     /// </summary>
  106.     /// <returns> количество вершин графа </returns>
  107.     int n() { return _N; }
  108.  
  109.     /// <summary>
  110.     /// Количество ребер графа
  111.     /// </summary>
  112.     /// <returns> количество ребер графа </returns>
  113.     int m() { return _M; }
  114.  
  115.     /// <summary>
  116.     /// Метод, выдающий информацию об
  117.     /// ориентированности графа
  118.     /// </summary>
  119.     /// <returns> true, если граф ориентированный, иначе - false </returns>
  120.     bool isDirected() { return IsDirected; }
  121.  
  122.     /// <summary>
  123.     /// Метод, выдающий информацию о
  124.     /// взвешенности графа
  125.     /// </summary>
  126.     /// <returns> true, если граф взвешенный, иначе - false </returns>
  127.     bool isWeighted() { return IsWeighted; }
  128.  
  129.     /// <summary>
  130.     /// Метод, возращающий список смежности графа
  131.     /// </summary>
  132.     /// <returns> список смежности графа </returns>
  133.     map<Vertice, map<Vertice, Edge>> edges() { return graph; }
  134.  
  135.     /// <summary>
  136.     /// Добавление вершины в граф
  137.     /// </summary>
  138.     /// <param name="v"> добавляемая в граф вершина </param>
  139.     void addVertice(Vertice v)
  140.     {
  141.         try
  142.         {
  143.             if (graph.find(v) != graph.end()) throw "Добавление вершины: заданная вершина уже есть в графе";
  144.             else
  145.             {
  146.                 ++_N;
  147.                 graph.insert(pair<Vertice, map<Vertice, Edge>>(v, map<Vertice, Edge>()));
  148.             }
  149.         }
  150.         catch (const char* msg)
  151.         {
  152.             cout << msg << "\n";
  153.         }
  154.     }
  155.  
  156.     /// <summary>
  157.     /// Удаление вершины из графа
  158.     /// </summary>
  159.     /// <param name="v"> удаляемая из графа вершина </param>
  160.     void removeVertice(Vertice v)
  161.     {
  162.         try
  163.         {
  164.             if (graph.find(v) == graph.end()) throw "Удаление вершины: в графе отсутствует заданная вершина";
  165.             else
  166.             {
  167.                 --_N; _M -= graph[v].size();
  168.  
  169.                 graph.erase(v);
  170.  
  171.                 for (auto p : graph)
  172.                     if (graph[p.first].find(v) != graph[p.first].end())
  173.                     {
  174.                         if (IsDirected) --_M;
  175.                         graph[p.first].erase(v);
  176.                     }
  177.             }
  178.         }
  179.         catch (const char* msg)
  180.         {
  181.             cout << msg << "\n";
  182.         }
  183.     }
  184.  
  185.     /// <summary>
  186.     /// Добавление ребра в граф
  187.     /// </summary>
  188.     /// <param name="u"> первая вершина ребра </param>
  189.     /// <param name="v"> вторая вершина ребра </param>
  190.     /// <param name="w"> вес ребра (для невзвешенных графов w = 1) </param>
  191.     void addEdge(Vertice u, Vertice v, Edge w)
  192.     {
  193.         try
  194.         {
  195.             if (graph.find(u) == graph.end() || graph.find(v) == graph.end()) throw "Добавление ребра: в графе отсутствует(ют) заданная(ые) вершина(ы)";
  196.             else if (!IsDirected && u == v) throw "Добавление ребра: невозможно добавить петлю в неориентированный граф";
  197.             else if (graph[u].find(v) != graph[u].end()) throw "Добавление ребра: заданное ребро уже есть в графе";
  198.             else
  199.             {
  200.                 ++_M;
  201.                 graph[u][v] = w;
  202.                 if (!IsDirected) graph[v][u] = w;
  203.             }
  204.         }
  205.         catch (const char* msg)
  206.         {
  207.             cout << msg << "\n";
  208.         }
  209.     }
  210.  
  211.     /// <summary>
  212.     /// Удаление ребра из графа
  213.     /// </summary>
  214.     /// <param name="u"> первая вершина ребра </param>
  215.     /// <param name="v"> вторая вершина ребра </param>
  216.     void removeEdge(Vertice u, Vertice v)
  217.     {
  218.         try
  219.         {
  220.             if (graph.find(u) == graph.end() || graph.find(v) == graph.end()) throw "Удаление ребра: в графе отсутствует(ют) заданная(ые) вершина(ы)";
  221.             else
  222.             {
  223.                 if (graph[u].find(v) == graph[u].end()) throw "Удаление ребра: в графе отсутствует заданное ребро";
  224.                 else
  225.                 {
  226.                     --_M;
  227.                     graph[u].erase(v);
  228.                     if (!IsDirected) graph[v].erase(u);
  229.                 }
  230.             }
  231.         }
  232.         catch (const char* msg)
  233.         {
  234.             cout << msg << "\n";
  235.         }
  236.     }
  237.  
  238.     /// <summary>
  239.     /// Очищение графа (ориентированность
  240.     /// и взвешенность остаются прежними)
  241.     /// </summary>
  242.     void clear()
  243.     {
  244.         _N = 0; _M = 0;
  245.         graph.clear();
  246.     }
  247.  
  248.     /// <summary>
  249.     /// Вывод информации о графе в файл или
  250.     /// на консоль (stdout)
  251.     /// </summary>
  252.     /// <param name="filePath"> путь к файлу или ключевое слово stdout </param>
  253.     void print(string filePath)
  254.     {
  255.         ofstream fout;
  256.  
  257.         if (filePath == "stdout") fout = ofstream(stdout);
  258.         else fout = ofstream(filePath);
  259.  
  260.         if (filePath != "stdout")
  261.         {
  262.             fout << "GRAPH ";
  263.  
  264.             if (IsDirected) fout << "directed ";
  265.             else fout << "undirected ";
  266.  
  267.             if (IsWeighted) fout << "weighted\n";
  268.             else fout << "unweighted\n";
  269.  
  270.             fout << "VERTICES: " << _N << "\n";
  271.  
  272.             for (auto p : graph)
  273.                 fout << p.first << "\n";
  274.  
  275.             fout << "EDGES: " << _M << "\n";
  276.  
  277.             for (auto p1 : graph)
  278.             {
  279.                 Vertice u = p1.first;
  280.  
  281.                 for (auto p2 : p1.second)
  282.                 {
  283.                     Vertice v = p2.first; Edge w = p2.second;
  284.  
  285.                     if (IsDirected || u < v)
  286.                     {
  287.                         fout << u << " " << v << " ";
  288.                         if (IsWeighted) fout << w;
  289.                         fout << "\n";
  290.                     }
  291.                 }
  292.             }
  293.  
  294.             fout.close();
  295.         }
  296.         else
  297.         {
  298.             fout << "GRAPH ";
  299.  
  300.             if (IsDirected) fout << "directed ";
  301.             else fout << "undirected ";
  302.  
  303.             if (IsWeighted) fout << "weighted\n";
  304.             else fout << "unweighted\n";
  305.  
  306.             fout << "VERTICES: " << _N << "\n";
  307.  
  308.             for (auto p : graph)
  309.                 fout << p.first << "\n";
  310.  
  311.             fout << "EDGES: " << _M << "\n";
  312.  
  313.             for (auto p1 : graph)
  314.             {
  315.                 Vertice u = p1.first;
  316.  
  317.                 fout << u << ": ";
  318.  
  319.                 for (auto p2 : p1.second)
  320.                 {
  321.                     Vertice v = p2.first; Edge w = p2.second;
  322.  
  323.                     if (!IsWeighted) fout << v << " ";
  324.                     else fout << "(" << v << ", " << w << ") ";
  325.                 }
  326.  
  327.                 fout << "\n";
  328.             }
  329.         }
  330.     }
  331. };
  332.  
  333. /// <summary>
  334. /// Система непересекающихся множеств
  335. /// </summary>
  336. /// <typeparam name="Vertice"> тип вершин графа </typeparam>
  337. template <class Vertice>
  338. class DSU
  339. {
  340.     /// <summary>
  341.     /// Словари: вершина - вершина-родитель и
  342.     /// вершина - высота соответствующего дерева
  343.     /// </summary>
  344.     map <Vertice, Vertice> parent;
  345.     map <Vertice, int> r;
  346.  
  347. public:
  348.  
  349.     /// <summary>
  350.     /// Конструктор
  351.     /// </summary>
  352.     /// <param name="vertices"> вершины исходного графа </param>
  353.     DSU(vector <Vertice> vertices)
  354.     {
  355.         for (auto v : vertices)
  356.             parent[v] = v;
  357.     }
  358.  
  359.     /// <summary>
  360.     /// Получение вершины-представителя множества
  361.     /// </summary>
  362.     /// <param name="v"> вершина </param>
  363.     /// <returns> вершина-представитель </returns>
  364.     Vertice get(Vertice v)
  365.     {
  366.         return (v == parent[v]) ? v : parent[v] = get(parent[v]);
  367.     }
  368.  
  369.     /// <summary>
  370.     /// Объединение множеств DSU
  371.     /// </summary>
  372.     /// <param name="u"> 1-ая вершина </param>
  373.     /// <param name="v"> 2-ая вершина </param>
  374.     /// <returns> степень успеха операции </returns>
  375.     bool merge(Vertice u, Vertice v)
  376.     {
  377.         // нам нужны вершины-представители
  378.         u = get(u); v = get(v);
  379.  
  380.         // одна компонента связности => ничего связывать не нужно
  381.         if (u == v) return false;
  382.  
  383.         // должно быть r[u] <= r[v]
  384.         if (r[u] > r[v]) swap(u, v);
  385.  
  386.         // подцепляем множество u (с меньшей высотой)
  387.         // к множеству v (с большей высотой)
  388.         parent[u] = v;
  389.         r[v] += r[u];
  390.  
  391.         // операция выполнилась успешно
  392.         return true;
  393.     }
  394. };
  395.  
  396. /// <summary>
  397. /// Алгоритм Краскала построения
  398. /// минимального остовного дерева
  399. /// </summary>
  400. /// <typeparam name="Vertice"> тип вершин графа </typeparam>
  401. /// <typeparam name="Edge"> тип ребер графа </typeparam>
  402. /// <param name="g"> граф </param>
  403. template <class Vertice, class Edge>
  404. void MST_Kruskal(Graph<Vertice, Edge>& g)
  405. {
  406.     try
  407.     {
  408.         if (g.isDirected()) throw "Задание III (Каркас) : граф должен быть неориентированным";
  409.         else if (!g.isWeighted()) throw "Задание III (Каркас) : граф должен быть взвешенным";
  410.         else
  411.         {
  412.             vector <Vertice> vertices;
  413.             map <Vertice, map<Vertice, Edge>> edges = g.edges();
  414.             vector <pair <Edge, pair <Vertice, Vertice>>> edgeList;
  415.  
  416.             map <Vertice, map <Vertice, Edge>> MST;
  417.  
  418.             for (auto p1 : edges)
  419.             {
  420.                 Vertice u = p1.first;
  421.                 vertices.push_back(u);
  422.  
  423.                 MST[u] = map<Vertice, Edge>();
  424.  
  425.                 for (auto p2 : edges[u])
  426.                 {
  427.                     Vertice v = p2.first; Edge w = p2.second;
  428.  
  429.                     if (u < v) edgeList.push_back({ w, { u, v } });
  430.                 }
  431.             }
  432.  
  433.             sort(edgeList.begin(), edgeList.end());
  434.  
  435.             Edge MST_cost = 0;
  436.  
  437.             int cnt = 0;
  438.  
  439.             DSU<Vertice> dsu(vertices);
  440.  
  441.             for (int i = 0; i < g.m(); ++i)
  442.             {
  443.                 Edge w = edgeList[i].first;
  444.                 Vertice u = edgeList[i].second.first, v = edgeList[i].second.second;
  445.  
  446.                 if (dsu.merge(u, v))
  447.                 {
  448.                     MST_cost += w; ++cnt;
  449.                     MST[u][v] = w; MST[v][u] = w;
  450.                 }
  451.             }
  452.  
  453.             if (cnt != g.n() - 1) cout << "Задание III (Каркас): граф не связен (построить минимальное остовное дерево не удалось). Зато получился лес: \n";
  454.             else
  455.             {
  456.                 cout << "Вес минимального остовного дерева: " << MST_cost << "\n";
  457.  
  458.                 cout << "Само минимальное остовное дерево имеет вид:\n";
  459.             }
  460.  
  461.             cout << "VERTICES: " << g.n() << "\n";
  462.  
  463.             for (auto p : MST)
  464.                 cout << p.first << "\n";
  465.  
  466.             cout << "EDGES: " << cnt << "\n";
  467.  
  468.             for (auto p1 : MST)
  469.             {
  470.                 Vertice u = p1.first;
  471.  
  472.                 cout << u << ": ";
  473.  
  474.                 for (auto p2 : p1.second)
  475.                 {
  476.                     Vertice v = p2.first; Edge w = p2.second;
  477.  
  478.                     cout << "(" << v << ", " << w << ") ";
  479.                 }
  480.  
  481.                 cout << "\n";
  482.             }
  483.         }
  484.     }
  485.     catch (const char* msg)
  486.     {
  487.         cout << msg << "\n";
  488.     }
  489. }
  490.  
  491. /// <summary>
  492. /// Алгоритм Прима построения
  493. /// минимального остовного дерева
  494. /// </summary>
  495. /// <typeparam name="Vertice"> тип вершин графа </typeparam>
  496. /// <typeparam name="Edge"> тип ребер графа </typeparam>
  497. /// <param name="g"> граф </param>
  498. template <class Vertice, class Edge>
  499. void MST_Prim(Graph<Vertice, Edge>& g)
  500. {
  501.     try
  502.     {
  503.         if (g.isDirected()) throw "Задание III (Каркас) : граф должен быть неориентированным";
  504.         else if (!g.isWeighted()) throw "Задание III (Каркас) : граф должен быть взвешенным";
  505.         else
  506.         {
  507.             map <Vertice, bool> used;
  508.             map <Vertice, map<Vertice, Edge>> MST;
  509.             map <Vertice, map<Vertice, Edge>> edges = g.edges();
  510.  
  511.             Vertice start;
  512.  
  513.             for (auto p1 : edges)
  514.             {
  515.                 Vertice u = p1.first;
  516.  
  517.                 if (used.size() == 0) start = u;
  518.                 used[u] = false;
  519.  
  520.                 MST[u] = map<Vertice, Edge>();
  521.             }
  522.  
  523.             Edge MST_cost = 0;
  524.  
  525.             priority_queue < pair<pair<Edge, Vertice>, Vertice>,
  526.                 vector <pair<pair<Edge, Vertice>, Vertice>>,
  527.                 greater < pair<pair<Edge, Vertice>, Vertice>> > pq;
  528.  
  529.             pq.push({ { 0, start }, start });
  530.  
  531.             int cnt = 0;
  532.  
  533.             while (!pq.empty())
  534.             {
  535.                 Vertice u = pq.top().second;
  536.                 Vertice v = pq.top().first.second; Edge w = pq.top().first.first; pq.pop();
  537.  
  538.                 if (!used[v])
  539.                 {
  540.                     MST_cost += w;
  541.  
  542.                     used[v] = true;
  543.  
  544.                     if (u != v)
  545.                     {
  546.                         ++cnt;
  547.  
  548.                         MST[u][v] = w;
  549.                         MST[v][u] = w;
  550.                     }
  551.  
  552.                     for (auto p : edges[v])
  553.                     {
  554.                         Vertice u = p.first; Edge w = p.second;
  555.  
  556.                         if (!used[u])
  557.                             pq.push({ { w, u }, v });
  558.                     }
  559.                 }
  560.             }
  561.  
  562.             try
  563.             {
  564.                 if (cnt != g.n() - 1) throw "Задание III (Каркас): граф несвязный :(";
  565.                 else
  566.                 {
  567.                     cout << "Вес минимального остовного дерева: " << MST_cost << "\n";
  568.  
  569.                     cout << "Само минимальное остовное дерево имеет вид:\n";
  570.  
  571.                     cout << "VERTICES: " << g.n() << "\n";
  572.  
  573.                     for (auto p : MST)
  574.                         cout << p.first << "\n";
  575.  
  576.                     cout << "EDGES: " << g.n() - 1 << "\n";
  577.  
  578.                     for (auto p1 : MST)
  579.                     {
  580.                         Vertice u = p1.first;
  581.  
  582.                         cout << u << ": ";
  583.  
  584.                         for (auto p2 : p1.second)
  585.                         {
  586.                             Vertice v = p2.first; Edge w = p2.second;
  587.  
  588.                             cout << "(" << v << ", " << w << ") ";
  589.                         }
  590.  
  591.                         cout << "\n";
  592.                     }
  593.                 }
  594.             }
  595.             catch (const char* msg)
  596.             {
  597.                 cout << msg << "\n";
  598.             }
  599.         }
  600.     }
  601.     catch (const char* msg)
  602.     {
  603.         cout << msg << "\n";
  604.     }
  605. }
  606.  
  607. //////////////////////////////////////////////
  608. //            ConsoleInterface.h            //
  609. //////////////////////////////////////////////
  610.  
  611. #pragma once
  612. #include "Graph.h"
  613. #include <vector>
  614. #include <string>
  615.  
  616. /// <summary>
  617. /// Консольный интерфейс, работающий с одним графом
  618. /// </summary>
  619. /// <typeparam name="Vertice"> тип вершин графа </typeparam>
  620. /// <typeparam name="Edge"> тип ребер графа </typeparam>
  621. template <class Vertice, class Edge = int>
  622. class ConsoleInterface
  623. {
  624.     /// <summary>
  625.     /// Граф
  626.     /// </summary>
  627.     Graph<Vertice, Edge> g;
  628.  
  629.     /// <summary>
  630.     /// Вывод на консоль списка доступных команд
  631.     /// </summary>
  632.     void Hint()
  633.     {
  634.         cout << "+---------------------------------------+\n";
  635.         cout << "|             СПИСОК КОМАНД             |\n";
  636.         cout << "+---------------------------------------+\n";
  637.         cout << "|  1. CREATE GRAPH direction weighting  |\n";
  638.         cout << "|  2. CREATE GRAPH filePath             |\n";
  639.         cout << "|  3. ADD VERTICE v                     |\n";
  640.         cout << "|  4. REMOVE VERTICE v                  |\n";
  641.         cout << "|  5. ADD EDGE u v [w]                  |\n";
  642.         cout << "|  6. REMOVE EDGE u w                   |\n";
  643.         cout << "|  7. CLEAR GRAPH                       |\n";
  644.         cout << "|  8. PRINT GRAPH filePath              |\n";
  645.         cout << "|  9. TASK Kruskal                      |\n";
  646.         cout << "|  10. TASK Prim                        |\n";
  647.         cout << "|  11. GET HINT                         |\n";
  648.         cout << "|  12. EXIT                             |\n";
  649.         cout << "+---------------------------------------+\n";
  650.     }
  651.  
  652. public:
  653.  
  654.     /// <summary>
  655.     /// Конструктор по умолчанию
  656.     /// </summary>
  657.     ConsoleInterface() {};
  658.  
  659.     /// <summary>
  660.     /// Запуск интерфейса
  661.     /// </summary>
  662.     void Start()
  663.     {
  664.         Hint();
  665.  
  666.         while (true)
  667.         {
  668.             cout << ">> ";
  669.  
  670.             string w1; cin >> w1;
  671.  
  672.             if (w1 == "CREATE")
  673.             {
  674.                 string w2, w3; cin >> w2 >> w3;
  675.  
  676.                 if (w3 == "directed" || w3 == "undirected")
  677.                 {
  678.                     string w4; cin >> w4;
  679.                     g = Graph<Vertice, Edge>(w3, w4);
  680.                 }
  681.                 else g = Graph<Vertice, Edge>(w3);
  682.             }
  683.             else if (w1 == "ADD")
  684.             {
  685.                 string w2; cin >> w2;
  686.  
  687.                 if (w2 == "VERTICE")
  688.                 {
  689.                     Vertice w3; cin >> w3;
  690.                     g.addVertice(w3);
  691.                 }
  692.                 else
  693.                 {
  694.                     Vertice w3, w4; Edge w5; cin >> w3 >> w4;
  695.  
  696.                     if (!g.isWeighted()) w5 = 1;
  697.                     else cin >> w5;
  698.  
  699.                     g.addEdge(w3, w4, w5);
  700.                 }
  701.             }
  702.             else if (w1 == "REMOVE")
  703.             {
  704.                 string w2; cin >> w2;
  705.  
  706.                 if (w2 == "VERTICE")
  707.                 {
  708.                     Vertice w3; cin >> w3;
  709.                     g.removeVertice(w3);
  710.                 }
  711.                 else
  712.                 {
  713.                     Vertice w3, w4; cin >> w3 >> w4;
  714.                     g.removeEdge(w3, w4);
  715.                 }
  716.             }
  717.             else if (w1 == "CLEAR")
  718.             {
  719.                 string w2; cin >> w2;
  720.                 g.clear();
  721.             }
  722.             else if (w1 == "PRINT")
  723.             {
  724.                 string w2, w3; cin >> w2 >> w3;
  725.                 g.print(w3);
  726.             }
  727.             else if (w1 == "TASK")
  728.             {
  729.                 string w2; cin >> w2;
  730.  
  731.                 if (w2 == "Kruskal") MST_Kruskal(g);
  732.                 else if (w2 == "Prim") MST_Prim(g);
  733.             }
  734.             else if (w1 == "GET")
  735.             {
  736.                 string w2; cin >> w2;
  737.                 Hint();
  738.             }
  739.             else if (w1 == "EXIT")
  740.             {
  741.                 break;
  742.             }
  743.         }
  744.     }
  745. };
  746.  
  747. /////////////////////////////////////
  748. //            Graph.cpp            //
  749. /////////////////////////////////////
  750.  
  751. #include "ConsoleInterface.h"
  752. #include <Windows.h>
  753.  
  754. int main()
  755. {
  756.     SetConsoleCP(1251);
  757.     SetConsoleOutputCP(1251);
  758.  
  759.     ConsoleInterface<string, int> consoleInterface;
  760.     consoleInterface.Start();
  761.  
  762.     return 0;
  763. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement