import 'src/graph.dart'; import 'dart:convert'; import 'dart:io'; int getIntLine() => int.parse(stdin.readLineSync(encoding: utf8)!); String getStrLine() => stdin.readLineSync(encoding: utf8)!; void printGraphsName(List inp) { print("Графы: "); for (int i = 0; i < inp.length; i++) { print("$i: ${inp[i].getName()}"); } } void main(List arguments) { /*Map x = {2: 10}; var p = Dot.fromMap("Т1", x); p.printD(); x = {}; x[3] = 11; var p2 = Dot.fromMap("Т2", {}); x = {}; var x1 = Graphs.fromList("Граф 1", [p, p2], true, false); x1.addIsolated("T3"); x1.addIsolated("T4"); x1.addPath(2, 3, 21); //print(x1.addPath(4, 1, 10)); x1.printG(); x1.printToFile("o.txt"); var x2 = Graphs.fromFile("o.txt"); x2.printG(); print(x2.bfsHasPath(1, 4)); print(x2.bfsPath(1, 3)); Graphs x1 = Graphs("Gt", false, true); x1.addIsolated("T1"); x1.addIsolated("T2"); x1.addIsolated("T3"); x1.addIsolated("T4"); x1.addPath(1, 3, 1); x1.addPath(3, 2, 5); x1.addPath(2, 4, 10); x1.printG(); print(x1.bfsPath(1, 4)); print(x1.bfsHasPath(1, 4)); print(x1.dfsIterative(1)); */ int deistvie = 1; List graphs = []; String name; String str = ""; Separators sep = Separators(); while (deistvie != 0) { stdout.write( "1 - создать граф, 2 - удалить граф, 3 - добавить в граф вершину,\n4 - удалить вершину, 5 - добавить ребро/дугу, 6 - удалить ребро/дугу,\n7 - вывести граф на экран, 8 - вывести граф в файл, 0 - выход\nDeistvie: "); deistvie = getIntLine(); switch (deistvie) { case 1: { // создать граф print("1 - ввести из файла, 2 - ввести вручную\nDeistvie: "); int d = getIntLine(); List list = []; switch (d) { case 1: { // из файла stdout.write("Имя файла: "); name = getStrLine(); graphs.add(Graphs.fromFile(name)); graphs.last.printG(); break; } case 2: { // с консоли stdout.write("Имя графа: "); name = getStrLine(); stdout.write( "Граф: 1 - ориентированный, 2 - не ориентированный: "); bool isOriented; String x = getStrLine(); if (x == "1") { isOriented = true; } else { isOriented = false; } stdout.write("Граф: 1 - взвешенный, 2 - не взвешенный: "); bool hasLength; x = getStrLine(); if (x == "1") { hasLength = true; } else { hasLength = false; } stdout.write("Количество вершин: "); int n = getIntLine(); list = []; for (int i = 0; i < n; i++) { stdout.write("Имя вершины: "); String dotName = getStrLine(); stdout.write( "Ввод: *куда*|*вес* через пробел. Если граф не взвешенный, то *вес* можно не указывать.\nВершина №${i + 1}. Смежна с: "); str = getStrLine(); List inn = []; List len = []; List a = str.split(sep.space); for (var splitted in a) { var dt = splitted.split(sep.dotToLength); if (dt.length == 2) { inn.add(int.parse(dt[0])); len.add(int.parse(dt[1])); } else if (dt.length == 1) { inn.add(int.parse(splitted)); len.add(0); } } list.add(Dot.fromTwoLists(dotName, inn, len)); } Graphs newG = Graphs.fromList(name, list, hasLength, isOriented); newG.printG(); graphs.add(newG); break; } } break; } case 2: { // удалить граф int num = graphs.length; printGraphsName(graphs); stdout.write("Удалить граф с номером: "); int x = getIntLine(); if (x >= 0 && x < num) { graphs.removeAt(x); } else { print("Не найден граф с таким номером"); } break; } case 3: { // добавить вершину List inn = []; List len = []; stdout.write("Имя вершины: "); String dotName = getStrLine(); stdout.write( "Ввод: *куда*|*вес* через пробел. Если граф не взвешенный, то *вес* можно не указывать.\nВершина cмежна с: "); str = getStrLine(); List a = str.split(sep.space); for (var splitted in a) { var dt = splitted.split(sep.dotToLength); if (dt.length == 2) { inn.add(int.parse(dt[0])); len.add(int.parse(dt[1])); } else if (dt.length == 1) { inn.add(int.parse(splitted)); len.add(0); } } printGraphsName(graphs); stdout.write("Вставка в графа с номером: "); int y = getIntLine(); if (y >= 0 && y < graphs.length) { graphs[y].addDotFromToLists(dotName, inn, len); } else { print("Не найден граф с таким номером"); } graphs[y].printG(); break; } case 4: { // удалить вершину int num = graphs.length; printGraphsName(graphs); stdout.write("Вывод графа с номером: "); int y = getIntLine(); if (y >= 0 && y < num) { graphs[y].printG(); num = graphs[y].getDotAmount(); stdout.write("Количество вершин: $num. Вершина для удаления: "); int x = getIntLine(); if (x >= 0 && x < num) { graphs[y].delDot(x); } else { print("Не найдены вершины в графе\n"); } } else { print("Не найден граф с таким номером"); } break; } case 5: { // добавить ребро/дугу int num = graphs.length; printGraphsName(graphs); stdout.write("Вставка в граф с номером: "); int y = getIntLine(); if (y >= 0 && y < num) { graphs[y].printG(); num = graphs[y].getDotAmount(); stdout.write("Количество вершин: $num. Вершина куда вствляется: "); int x1 = getIntLine(); stdout.write("Вершина, которую вставляют: "); int x2 = getIntLine(); stdout.write("Вес ребра, вствить 0 если граф не взвешенный: "); int w = getIntLine(); if (x1 >= 0 && x1 < num && x2 >= 0 && x2 < num) { graphs[y].addPath(x1, x2, w); } else { print("Не найдены вершины в графе\n"); } } else { print("Не найден граф с таким номером"); } break; } case 6: { // удалить ребро/дугу int num = graphs.length; printGraphsName(graphs); stdout.write("Удаление из графа с номером: "); int y = getIntLine(); int x1, x2; if (y >= 0 && y < num) { graphs[y].printG(); num = graphs[y].getDotAmount(); stdout.write( "Количество вершин: $num. Введите через пробел 2 вершины, между которыми удалить ребро: "); List x = getStrLine().split(sep.space); x1 = int.parse(x[0]); x2 = int.parse(x[1]); if (x1 >= 0 && x1 < num && x2 >= 0 && x2 < num) { graphs[y].delPath(x1, x2); } else { print("Не найдены вершины в графе\n"); } } else { print("Не найден граф с таким номером"); } break; } case 7: // вывод в консоль { int num = graphs.length; printGraphsName(graphs); stdout.write("Вывод графа с номером: "); int x = getIntLine(); if (x >= 0 && x < num) { graphs[x].printG(); } else { print("Не найден граф с таким номером"); } break; } case 8: { // вывод в файл int num = graphs.length; printGraphsName(graphs); stdout.write("Вывод графа с номером: "); int x = getIntLine(); stdout.write("В файл: "); String out = getStrLine(); if (x >= 0 && x < num) { graphs[x].printToFile(out); } else { print("Не найден граф с таким номером"); } break; } case 0: getStrLine(); exit(0); default: print("Действие не распознано"); break; } } }