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