Advertisement
myloyo

4. список смежности Iб: несколько графов

Nov 17th, 2024
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5. #include <vector>
  6. #include <list>
  7. #include <map>
  8. #include <queue>
  9. #include <locale>
  10. #include <windows.h>
  11.  
  12. using namespace std;
  13.  
  14. class Graph {
  15. private:
  16.     map<string, map<string, int>> AdjList;
  17.     bool direct;
  18.     bool weight;
  19.  
  20. public:
  21.     Graph(map<string, map<string, int>> a, bool d, bool w) {
  22.         AdjList = a;
  23.         direct = d;
  24.         weight = w;
  25.     }
  26.  
  27.     Graph(const Graph& g) {
  28.         this->AdjList = g.AdjList;
  29.         this->direct = g.direct;
  30.         this->weight = g.weight;
  31.     }
  32.  
  33.     void operator()(const Graph& g) {
  34.         this->AdjList = g.AdjList;
  35.         this->direct = g.direct;
  36.         this->weight = g.weight;
  37.     }
  38.  
  39.     Graph() {
  40.         AdjList.clear();
  41.         direct = false;
  42.         weight = 0;
  43.     }
  44.  
  45.     ~Graph() {
  46.         direct = false;
  47.         weight = false;
  48.         AdjList.clear();
  49.     }
  50.  
  51.     bool GetDir() {
  52.         return this->direct;
  53.     }
  54.  
  55.     bool GetWeight() {
  56.         return this->weight;
  57.     }
  58.  
  59.     void SetDir(bool d) {
  60.         this->direct = d;
  61.     }
  62.  
  63.     void SetWeight(bool w) {
  64.         this->weight = w;
  65.     }
  66.  
  67.     bool ExistVertex(string v) {
  68.         return AdjList.find(v) != AdjList.end();
  69.     }
  70.  
  71.     bool ExistEdge(string v1, string v2) {
  72.         return AdjList.find(v1)->second.find(v2) != AdjList.find(v1)->second.end();
  73.     }
  74.  
  75.     map <string, map<string, int>> GetAdj() {
  76.         return this->AdjList;
  77.     }
  78.  
  79.     void AddVertex(string v) {
  80.         if (!ExistVertex(v)) {
  81.             map<string, int> second;
  82.             AdjList.insert({ v, second });
  83.         }
  84.         else {
  85.             cout << "Вершина уже существует" << endl;
  86.         }
  87.     }
  88.  
  89.     void AddEdge(string v1, string v2) {   //для невзвешенного
  90.         if (!ExistVertex(v1) || !ExistVertex(v2)) {
  91.             cout << "Вершин не существует\n";
  92.         }
  93.         else {
  94.             if (ExistEdge(v1, v2)) {
  95.                 cout << "Ребро уже существует!\n";
  96.             }
  97.             else {
  98.                 AdjList[v1][v2];
  99.                 if (!direct) {
  100.                     AdjList[v2][v1];
  101.                 }
  102.             }
  103.         }
  104.     }
  105.  
  106.     void AddEdge(string v1, string v2, int w) { //для взвешенного
  107.         if (!ExistVertex(v1) || !ExistVertex(v2)) {
  108.             cout << "Вершин не существует\n";
  109.         }
  110.         else {
  111.             if (ExistEdge(v1, v2)) {
  112.                 cout << "Ребро уже существует!\n";
  113.             }
  114.             else {
  115.                 AdjList[v1][v2] = w;
  116.                 if (!direct) {
  117.                     AdjList[v2][v1] = w;
  118.                 }
  119.             }
  120.         }
  121.     }
  122.  
  123.     void DeleteVertex(string v) {
  124.         if (ExistVertex(v) == false) {
  125.             cout << "Вершины не существует\n";
  126.         }
  127.         else {
  128.             for (auto& it : AdjList) {
  129.                 if (it.second.find(v) != it.second.end()) {
  130.                     it.second.erase(v);
  131.                 }
  132.             }
  133.             AdjList.erase(v);
  134.         }
  135.     }
  136.  
  137.     void DeleteEdge(string v1, string v2) {
  138.         if (ExistEdge(v1, v2)) {
  139.             map<string, map<string, int>>::iterator i;
  140.             map<string, int>::iterator j;
  141.  
  142.             i = AdjList.find(v1);
  143.             j = i->second.find(v2);
  144.             i->second.erase(j);
  145.             if (!direct) {
  146.                 AdjList.find(v2)->second.erase(v1);
  147.             }
  148.         }
  149.         else {
  150.             cout << "Ребра не существует\n";
  151.         }
  152.     }
  153.  
  154.     void PrintList() {
  155.         if (weight) {
  156.             for (auto& elem : AdjList) {
  157.                 cout << "vertex " << elem.first + ": ";
  158.                 for (auto& it : elem.second) {
  159.                     cout << it.first << " (w = " << it.second << "); ";
  160.                 }
  161.                 cout << "\n";
  162.             }
  163.             cout << "\n";
  164.         }
  165.         else {
  166.             for (auto& elem : AdjList) {
  167.                 cout << "vertex " << elem.first + ": ";
  168.                 for (auto& it : elem.second) {
  169.                     cout << it.first << "; ";
  170.                 }
  171.                 cout << "\n";
  172.             }
  173.             cout << "\n";
  174.         }
  175.     }
  176.  
  177.     void loadFromFile(string filename) {
  178.         ifstream in(filename);
  179.         if (!in.is_open()) {
  180.             throw runtime_error("Не удалось открыть файл для чтения.");
  181.         }
  182.         string dir;
  183.         in >> dir;
  184.         if (dir == "directed") {
  185.             direct = true;
  186.         }
  187.         else if (dir == "undirected") {
  188.             direct = false;
  189.         }
  190.         else {
  191.             throw runtime_error("Неверный формат файла: не указано directed или undirected\n");
  192.         }
  193.  
  194.         string type;
  195.         in >> type;
  196.         if (type == "weighted") {
  197.             weight = true;
  198.         }
  199.         else if (type == "unweighted") {
  200.             weight = false;
  201.         }
  202.         else {
  203.             throw runtime_error("Неверный формат файла: не указано weighted или unweighted\n");
  204.         }
  205.  
  206.         if (weight) {
  207.             string u, v;
  208.             int weight;
  209.             while (in >> u >> v >> weight) {
  210.                 if (!ExistVertex(u)) {
  211.                     AddVertex(u);
  212.                 }
  213.                 if (!ExistVertex(v)) {
  214.                     AddVertex(v);
  215.                 }
  216.                 AddEdge(u, v, weight);
  217.             }
  218.         }
  219.         else {
  220.             string u, v;
  221.             while (in >> u >> v) {
  222.                 if (!ExistVertex(u)) {
  223.                     AddVertex(u);
  224.                 }
  225.                 if (!ExistVertex(v)) {
  226.                     AddVertex(v);
  227.                 }
  228.                 AddEdge(u, v);
  229.             }
  230.         }
  231.     }
  232.  
  233.     void Task4() {
  234.         this->PrintList();
  235.         vector<pair<string, string>> edges;
  236.  
  237.         for (auto vertex : AdjList) {
  238.             string v1 = vertex.first;
  239.             for (auto edge : vertex.second) {
  240.                 string v2 = edge.first;
  241.                 if (AdjList.find(v2) == AdjList.end() || AdjList[v2].find(v1) == AdjList[v2].end()) {
  242.                     edges.push_back({ v1, v2 });
  243.                 }
  244.             }
  245.         }
  246.  
  247.         for (auto edge : edges) {
  248.             this->DeleteEdge(edge.first, edge.second);
  249.         }
  250.  
  251.         cout << "Теперь список смежности выглядит так:\n";
  252.         this->PrintList();
  253.     }
  254. };
  255.  
  256.  
  257. // файл prac.cpp
  258.  
  259. #include <iostream>
  260. #include <string>
  261. #include <vector>
  262. #include <fstream>
  263. #include <vector>
  264. #include <list>
  265. #include <map>
  266. #include <locale>
  267. #include <windows.h>
  268. #include "Graph.h"
  269.  
  270. using namespace std;
  271.  
  272. int main() {
  273.     setlocale(LC_ALL, "Russian");
  274.     SetConsoleOutputCP(CP_UTF8);
  275.     map<string, Graph> graphs;
  276.  
  277.     string s = "prim4.txt";
  278.     Graph g;
  279.     g.loadFromFile(s);
  280.     graphs[s] = g;
  281.  
  282.     cout << "\n";
  283.     //Задание 4
  284.     g.Task4();
  285. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement