Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // класс графа
- #include <iostream>
- #include <string>
- #include <vector>
- #include <fstream>
- #include <vector>
- #include <list>
- #include <map>
- #include <locale>
- #include <windows.h>
- using namespace std;
- class Graph {
- private:
- map<string, map<string, int>> AdjList;
- bool direct;
- bool weight;
- public:
- Graph(map<string, map<string, int>> a, bool d, bool w) {
- AdjList = a;
- direct = d;
- weight = w;
- }
- Graph(const Graph &g) {
- this->AdjList = g.AdjList;
- this->direct = g.direct;
- this->weight = g.weight;
- }
- void operator()(const Graph &g) {
- this->AdjList = g.AdjList;
- this->direct = g.direct;
- this->weight = g.weight;
- }
- Graph() {
- AdjList.clear();
- direct = false;
- weight = 0;
- }
- ~Graph() {
- direct = false;
- weight = false;
- AdjList.clear();
- }
- bool GetDir() {
- return this->direct;
- }
- bool GetWeight() {
- return this->weight;
- }
- void SetDir(bool d) {
- this->direct = d;
- }
- void SetWeight(bool w) {
- this->weight = w;
- }
- bool ExistVertex(string v) {
- return AdjList.find(v) != AdjList.end();
- }
- bool ExistEdge(string v1, string v2) {
- return AdjList.find(v1)->second.find(v2) != AdjList.find(v1)->second.end();
- }
- map <string, map<string, int>> GetAdj() {
- return this->AdjList;
- }
- void AddVertex(string v) {
- if (!ExistVertex(v)) {
- map<string, int> second;
- AdjList.insert({ v, second });
- }
- else {
- cout << "Вершина уже существует" << endl;
- }
- }
- void AddEdge(string v1, string v2) { //для невзвешенного
- if (!ExistVertex(v1) || !ExistVertex(v2)) {
- cout << "Вершин не существует\n";
- }
- else {
- if (ExistEdge(v1, v2)) {
- cout << "Ребро уже существует!\n";
- }
- else {
- AdjList[v1][v2];
- if (!direct) {
- AdjList[v2][v1];
- }
- }
- }
- }
- void AddEdge(string v1, string v2, int w) { //для взвешенного
- if (!ExistVertex(v1) || !ExistVertex(v2)) {
- cout << "Вершин не существует\n";
- }
- else {
- if (ExistEdge(v1, v2)) {
- cout << "Ребро уже существует!\n";
- }
- else {
- AdjList[v1][v2] = w;
- if (!direct) {
- AdjList[v2][v1] = w;
- }
- }
- }
- }
- void DeleteVertex(string v) {
- if (ExistVertex(v) == false) {
- cout << "Вершины не существует\n";
- }
- else {
- for (auto& it : AdjList) {
- if (it.second.find(v) != it.second.end()) {
- it.second.erase(v);
- }
- }
- AdjList.erase(v);
- }
- }
- void DeleteEdge(string v1, string v2) {
- if (ExistEdge(v1, v2)) {
- map<string, map<string, int>>::iterator i;
- map<string, int>::iterator j;
- i = AdjList.find(v1);
- j = i->second.find(v2);
- i->second.erase(j);
- if (!direct) {
- AdjList.find(v2)->second.erase(v1);
- }
- }
- else {
- cout << "Ребра не существует\n";
- }
- }
- void PrintList() {
- if (weight) {
- for (auto& elem : AdjList) {
- cout << "vertex " << elem.first + ": ";
- for (auto& it : elem.second) {
- cout << it.first << " (w = " << it.second << "); ";
- }
- cout << "\n";
- }
- cout << "\n";
- }
- else {
- for (auto& elem : AdjList) {
- cout << "vertex " << elem.first + ": ";
- for (auto& it : elem.second) {
- cout << it.first << "; ";
- }
- cout << "\n";
- }
- cout << "\n";
- }
- }
- void loadFromFile(string filename) {
- ifstream in(filename);
- if (!in.is_open()) {
- throw runtime_error("Не удалось открыть файл для чтения.");
- }
- string dir;
- in >> dir;
- if (dir == "directed") {
- direct = true;
- }
- else if (dir == "undirected") {
- direct = false;
- }
- else {
- throw runtime_error("Неверный формат файла: не указано directed или undirected\n");
- }
- string type;
- in >> type;
- if (type == "weighted") {
- weight = true;
- }
- else if (type == "unweighted") {
- weight = false;
- }
- else {
- throw runtime_error("Неверный формат файла: не указано weighted или unweighted\n");
- }
- if (weight) {
- string u, v;
- int weight;
- while (in >> u >> v >> weight) {
- if (!ExistVertex(u)) {
- AddVertex(u);
- }
- if (!ExistVertex(v)) {
- AddVertex(v);
- }
- AddEdge(u, v, weight);
- }
- }
- else {
- string u, v;
- while (in >> u >> v) {
- if (!ExistVertex(u)) {
- AddVertex(u);
- }
- if (!ExistVertex(v)) {
- AddVertex(v);
- }
- AddEdge(u, v);
- }
- }
- }
- }
- #include <iostream>
- #include <string>
- #include <vector>
- #include <fstream>
- #include <vector>
- #include <list>
- #include <map>
- #include <locale>
- #include <windows.h>
- #include "Graph.h"
- using namespace std;
- int main() {
- setlocale(LC_ALL, "Russian");
- SetConsoleOutputCP(CP_UTF8);
- map<string, Graph> graphs;
- string cur = "";
- while (true) {
- cout << "\t~~Меню функций~~\n";
- cout << "1. Загрузить граф из файла\n";
- cout << "2. Выбрать текущий существующий граф\n";
- cout << "3. Создать свой граф\n";
- cout << "4. Показать список смежности текущего графа\n";
- cout << "5. Добавить вершину\n";
- cout << "6. Добавить ребро\n";
- cout << "7. Удалить вершину\n";
- cout << "8. Удалить ребро\n";
- cout << "9. Копировать граф\n";
- cout << "10. Выйти\n";
- int x; cout << "Выберите действие: ";
- cin >> x;
- if (x == 1) {
- Graph g;
- cout << "Введите название файла: ";
- string s; cin >> s;
- ifstream in(s);
- if (!in.is_open()) {
- throw runtime_error("Не удалось открыть файл для чтения.");
- }
- else{
- g.loadFromFile(s);
- graphs[s] = g;
- cur = s;
- cout << "\n";
- }
- }
- else if (x == 2) {
- cout << "Какой граф выбираем?\n";
- for (auto i : graphs) {
- cout << i.first << "\n";
- }
- string s;
- cin >> s;
- cur = s;
- cout << "Установлен текущий граф: " << s << "\n";
- }
- else if (x == 3) {
- Graph g1;
- string c1, c2;
- cout << "Граф взвешенный? ";
- cin >> c1;
- if (c1 == "yes" || c1 == "да") {
- g1.SetWeight(true);
- }
- else if (c1 == "no" || c1 == "нет") {
- g1.SetWeight(false);
- }
- cout << "Граф ориентированный? ";
- cin >> c2;
- if (c2 == "yes" || c2 == "да") {
- g1.SetDir(true);
- }
- else if (c2 == "no" || c2 == "нет") {
- g1.SetDir(false);
- }
- string u, v;
- int w;
- cout << "Вводите ребра графа, для завершения введите -1 -1 (и еще -1 если взвешенный)";
- if (g1.GetWeight()) {
- while (u != "-1" and v != "-1") {
- cin >> u >> v >> w;
- if (!g1.ExistVertex(u)) {
- g1.AddVertex(u);
- }
- if (!g1.ExistVertex(v)) {
- g1.AddVertex(v);
- }
- g1.AddEdge(u, v, w);
- }
- }
- else {
- while (u != "-1" and v != "-1") {
- cin >> u >> v;
- if (!g1.ExistVertex(u)) {
- g1.AddVertex(u);
- }
- if (!g1.ExistVertex(v)) {
- g1.AddVertex(v);
- }
- g1.AddEdge(u, v);
- }
- }
- string name;
- cout << "Введите название графа: ";
- cin >> name;
- cur = name;
- graphs[name] = g1;
- }
- else if (x == 4) {
- cout << cur << "\n";
- cout << "Список смежности для графа " << cur << "\n";
- graphs[cur].PrintList();
- cout << "\n";
- }
- else if (x == 5) {
- string u;
- cout << "Введите вершину: ";
- cin >> u;
- graphs[cur].AddVertex(u);
- cout << "\n";
- }
- else if (x == 6) {
- string u, v;
- cout << "Введите вершины: ";
- cin >> u >> v;
- if (graphs[cur].GetWeight() == true) {
- cout << "Введите вес ребра: ";
- int w; cin >> w;
- graphs[cur].AddEdge(u, v, w);
- }
- else {
- graphs[cur].AddEdge(u, v);
- }
- cout << "\n";
- }
- else if (x == 7) {
- string s;
- cout << "Введите вершину для удаления: ";
- cin >> s;
- graphs[cur].DeleteVertex(s);
- cout << "\n";
- }
- else if (x == 8) {
- string u, v;
- cout << "Введите ребро для удаления: ";
- cin >> u >> v;
- graphs[cur].DeleteEdge(u, v);
- }
- else if (x == 9) {
- string name;
- cout << "Введите имя графа, в который копируем текущий граф: ";
- cin >> name;
- graphs[name](graphs[cur]);
- cout << "Граф успешно скопирован!\n";
- }
- else if (x == 10) {
- cout << "Работа с графами завершена.\n";
- exit(0);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement