Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace lab_siaod_8_9
- {
- class Program
- {
- static int[] cog = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static int[] dog = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static int[] fog = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static int time = 0;
- static int[] d = new int[] { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 };
- static int[] d1 = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static int[] d2 = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static int[,] dec = new int[20, 20];
- static int[][,] og = new int[20][,];
- static int[,] ng = new int[20, 20];
- static int[,] ngo = new int[20, 20];
- static int[] u = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static int[,] W = new int[20, 20];
- static int[,] f = new int[20, 20];
- static void bf(int s)
- {
- d[s] = 0;
- for (int g = 0; g < 20; g++)
- {
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < og[i].Length / 2; j++)
- {
- if (d[og[i][j, 0]] > (d[i] + og[i][j, 1])) d[og[i][j, 0]] = (d[i] + og[i][j, 1]);
- }
- }
- }
- }
- static void adec(int s)
- {
- d2[s] = 1;
- d1[s] = 0;
- int min = 50,x=0,y=0;
- for (int g = 0; g < 19; g++)
- {
- for (int i = 0; i < 20; i++)
- {
- if (d2[i] == 0) continue;
- for (int j = 0; j < 20; j++)
- {
- if (d2[j] == 1) continue;
- if (dec[i, j] <= min)
- {
- min = dec[i, j];
- x = i;
- y = j;
- }
- }
- }
- d1[y] = d1[x] + min;
- d2[y] = 1;
- dec[x, y] = 99;
- min = 50;
- }
- }
- static void dfs(int i)
- {
- //Console.Write("\nНахождение в вершине:"+i+";");
- cog[i] = 1;
- time++;
- dog[i] = time;
- for (int j = 0; j < og[i].Length / 2; j++)
- {
- if (cog[og[i][j, 0]] == 0)
- {
- Console.Write("\nРебро ("+i+","+og[i][j,0]+") - ребро дерева\n");
- dfs(og[i][j, 0]);
- }
- if (cog[og[i][j, 0]] == 1)
- {
- Console.Write("\nРебро (" + i + "," + og[i][j, 0] + ") - обратное ребро\n");
- }
- if (cog[og[i][j, 0]] == 2)
- {
- Console.Write("\nРебро (" + i + "," + og[i][j, 0] + ") - прямое или перекрестное ребро\n");
- }
- cog[og[i][j, 0]] = 2;
- fog[og[i][j, 0]] = time = time + 1;
- //Console.Write("\nНе найдены белые вершины/Возврат в вершину:" + i + ";");
- }
- }
- static int min(int a, int b)
- {
- if (a > b) return b;
- else return a;
- }
- static void fw()
- {
- for (int k = 0; k < 20; k++)
- for (int i = 0; i < 20; i++)
- for (int j = 0; j < 20; j++)
- {
- W[i, j] = min(W[i, j], W[i, k] + W[k, j]);
- }
- }
- static void prim(int w)
- {
- int x=0, y=0;
- int min = 50;
- for (int i = 0; i < 20; i++)
- {
- u[w] = 1;
- x = w;
- for(int g=0;g<20;g++)
- {
- if(u[g]==0)continue;
- for (int j = 0; j < 20; j++)
- {
- if (u[j] == 1) continue;
- if (min > ng[g, j])
- {
- min = ng[g, j];
- x= g;
- y = j;
- }
- }
- }
- if (min == 50) continue;
- ngo[x, y] = ngo[y, x] = min;
- min = 50;
- w = y;
- //Console.Write("\n");
- //Console.Write("добавится"+ w+"\n");
- //for (int g = 0; g < 20; g++) Console.Write(u[g]);
- //Console.Write("\n");
- }
- }
- static bool[] mp = new bool[20];
- static int ff1(int s, int t, int inf)
- {
- if(s==t)return inf;
- mp[s] = true;
- for (int v = 0; v < 20; v++)
- {
- if (!mp[v] && (f[s, v] > 0))
- {
- int df = ff1(v,t,min(inf,f[s,v]));
- if (df > 0)
- {
- f[s, v] -= df;
- f[v, s] += df;
- return df;
- }
- }
- }
- return 0;
- }
- static int ff(int s, int t)
- {
- for (int p = 0; ; )
- {
- for (int i = 0; i < 20; i++) mp[i] = false;
- int df = ff1(s, t, 9999999);
- if (df == 0) return p;
- p += df;
- }
- }
- static void Main(string[] args)
- {
- Random ran = new Random();
- //ориентированный
- og[0] = new int[1, 2];
- og[1] = new int[1, 2];
- og[2] = new int[2, 2];
- og[3] = new int[3, 2];
- og[4] = new int[1, 2];
- og[5] = new int[2, 2];
- og[6] = new int[2, 2];
- og[7] = new int[1, 2];
- og[8] = new int[2, 2];
- og[9] = new int[1, 2];
- og[10] = new int[2, 2];
- og[11] = new int[2, 2];
- og[12] = new int[1, 2];
- og[13] = new int[1, 2];
- og[14] = new int[1, 2];
- og[15] = new int[1, 2];
- og[16] = new int[1, 2];
- og[17] = new int[1, 2];
- og[18] = new int[1, 2];
- og[19] = new int[2, 2];
- og[0][0, 0] = 5;
- og[1][0, 0] = 6;
- og[2][0, 0] = 8;
- og[2][1, 0] = 18;
- og[3][0, 0] = 2;
- og[3][1, 0] = 4;
- og[3][2, 0] = 9;
- og[4][0, 0] = 14;
- og[5][0, 0] = 1;
- og[5][1, 0] = 10;
- og[6][0, 0] = 0;
- og[6][1, 0] = 12;
- og[7][0, 0] = 12;
- og[8][0, 0] = 3;
- og[8][1, 0] = 13;
- og[9][0, 0] = 13;
- og[10][1, 0] = 16;
- og[10][0, 0] = 19;
- og[11][1, 0] = 5;
- og[11][0, 0] = 15;
- og[12][0, 0] = 16;
- og[13][0, 0] = 17;
- og[14][0, 0] = 9;
- og[15][0, 0] = 17;
- og[16][0, 0] = 11;
- og[17][0, 0] = 7;
- og[18][0, 0] = 14;
- og[19][0, 0] = 17;
- og[19][1, 0] = 8;
- for (int i = 0; i < 20; i++) for (int j = 0; j < og[i].Length / 2; j++) og[i][j, 1] = ran.Next(1, 10);
- while (true)
- {
- //конец ориентированный
- Console.WriteLine("\nДействия:\n1)Вывести список смежности\n2)Поиск в глубину\n3)Поиск путей из выбранной вершины(Беллмана-Форда)\n4)Матрица смежности неотриентированного графа\n5)Матрица смежности оставного дерева с псевдографикой\n6)Матрица кратчайших путей\n7)Максимальный поток\n8)Выход\n9)Поиск путей из выбранной вершины(Дейкстры)\n");
- int change,n;
- string str;
- str=Console.ReadLine();
- change = int.Parse(str);
- if (change == 8) return;
- if (change == 1)
- {
- Console.Write("Список смежности ориентированного графа:\n");
- for (int i = 0; i < 20; i++)
- {
- Console.Write("вершина " + i + "->");
- for (int j = 0; j < og[i].Length / 2; j++) Console.Write(og[i][j, 0] + "," + og[i][j, 1] + " ");
- Console.Write("\n");
- };
- continue;
- }
- //bf
- if (change == 3)
- {
- Console.Write("\nНомер вершины(1-20):\n");
- str = Console.ReadLine();
- n = int.Parse(str);
- bf(n);
- Console.Write("\nВершина:\n");
- for (int i = 0; i < 20; i++)
- {
- if (i < 10) Console.Write(" ");
- Console.Write(i + " ");
- }
- Console.Write("\n");
- for (int i = 0; i < 20; i++)
- {
- if (d[i] < 10) Console.Write(" ");
- Console.Write(d[i] + " ");
- }
- Console.Write("\n-Путь из вершины\n");
- continue;
- }
- //bf
- //начало DFS
- Console.Write("\nПоиск в глубину:\n");
- if (change == 2)
- {
- time = 0;
- for (int i = 0; i < 20; i++)
- {
- if (cog[i] == 0) dfs(i);
- else continue;
- cog[i] = 2;
- fog[i] = time = time + 1;
- }
- Console.Write("\nПоиск в глубину:\n");
- Console.Write("Вершина" + "->" + "Время обращения" + "_" + "Время завершения работы" + "\n");
- for (int i = 0; i < 20; i++)
- {
- Console.Write(i + "->" + dog[i] + "_" + fog[i] + "\n");
- }
- continue;
- }
- //конец DFS
- //начало неориентированный
- for (int i = 0; i < 20; i++)
- for (int j = 0; j < 20; j++) ng[i, j] = 99;
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < og[i].Length / 2; j++)
- {
- { ng[i, og[i][j, 0]] = ng[og[i][j, 0], i] = ran.Next(1, 10); }
- }
- }
- if (change == 4)
- {
- Console.Write("Неориентированный граф:\n");
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (ng[i, j] < 10) Console.Write(" ");
- Console.Write(ng[i, j] + " ");
- }
- Console.Write("\n");
- }
- continue;
- }
- //конец неориентированный
- //начало Прима
- for (int i = 0; i < 20; i++)
- for (int j = 0; j < 20; j++) ngo[i, j] = 0;
- if (change == 5)
- {
- Console.Write("\nНомер вершины(0-19):\n");
- str = Console.ReadLine();
- n = int.Parse(str);
- prim(n);
- Console.Write("\n");
- Console.Write("Матрица смежности остовного дерева:\n");
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++) Console.Write(ngo[i, j] + " ");
- Console.Write("\n");
- }
- Console.Write("Остовное дерево:\n");
- //псевдографика для прима
- //первый ряд
- Console.Write(" ");
- Console.Write("( 0)");
- if (ngo[0, 6] == 0) Console.Write(" "); else Console.Write("\\");
- Console.Write(" ");
- if (ngo[1, 5] == 0) Console.Write(" "); else Console.Write("/");
- Console.Write("( 1)");
- Console.Write(" ");
- Console.Write("( 2)");
- if (ngo[2, 3] == 0) Console.Write(" "); else Console.Write("---");
- Console.Write("( 3)");
- if (ngo[3, 4] == 0) Console.Write(" "); else Console.Write("---");
- Console.Write("( 4)");
- Console.Write("\n");
- //второй ряд
- Console.Write(" ");
- if (ngo[0, 5] == 0) Console.Write(" "); else Console.Write(" | ");
- if ((ngo[0, 6] == 0) && (ngo[1, 5] == 0)) Console.Write(" ");
- else if ((ngo[0, 6] == 0) && (ngo[1, 5] != 0)) Console.Write(" / ");
- else if ((ngo[0, 6] != 0) && (ngo[1, 5] == 0)) Console.Write(" \\ "); else Console.Write(" X ");
- if (ngo[1, 6] == 0) Console.Write(" "); else Console.Write(" | ");
- Console.Write(" ");
- if (ngo[2, 18] == 0) Console.Write(" "); else Console.Write("\\");
- if (ngo[2, 8] == 0) Console.Write(" "); else Console.Write("\\ ");
- if (ngo[3, 8] == 0) Console.Write(" "); else Console.Write(" | ");
- if (ngo[3, 9] == 0) Console.Write(" "); else Console.Write("\\ ");
- Console.Write(" ");
- if (ngo[4, 14] == 0) Console.Write(" "); else Console.Write("\\");
- Console.Write("\n");
- //третий ряд
- Console.Write(" ");
- Console.Write("( 5)");
- if (ngo[1, 5] == 0) Console.Write(" "); else Console.Write("-");
- Console.Write(" ");
- if (ngo[0, 6] == 0) Console.Write(" "); else Console.Write("-");
- Console.Write("( 6)");
- if (ngo[6, 12] == 0) Console.Write(" "); else Console.Write("\\ ");
- Console.Write("( 7)");
- if (ngo[2, 18] == 0) Console.Write(" "); else Console.Write("\\");
- if (ngo[2, 8] == 0) Console.Write(" "); else Console.Write("--");
- Console.Write("( 8)");
- if (ngo[8, 19] == 0) Console.Write(" "); else Console.Write("\\");
- if (ngo[3, 9] == 0) Console.Write(" "); else Console.Write("--");
- Console.Write("( 9)");
- if (ngo[4, 14] == 0) Console.Write(" "); else Console.Write("|");
- Console.Write("\n");
- //четвертый ряд
- Console.Write(" ");
- if (ngo[5, 10] == 0) Console.Write(" "); else Console.Write(" | ");
- if (ngo[5, 11] == 0) Console.Write(" "); else Console.Write("\\ ");
- Console.Write(" ");
- if (ngo[6, 12] == 0) Console.Write(" "); else Console.Write(" -\\");
- if (ngo[7, 12] == 0) Console.Write(" "); else Console.Write(" | ");
- if (ngo[7, 17] == 0) Console.Write(" "); else Console.Write("\\");
- if (ngo[2, 18] == 0) Console.Write(" "); else Console.Write("\\ ");
- if (ngo[8, 13] == 0) Console.Write(" "); else Console.Write(" | ");
- if ((ngo[8, 19] == 0) && (ngo[13, 9] == 0)) Console.Write(" ");
- else if ((ngo[8, 19] == 0) && (ngo[13, 9] != 0)) Console.Write(" -/");
- else if ((ngo[8, 19] != 0) && (ngo[13, 9] == 0)) Console.Write(" | "); else Console.Write(" + ");
- if (ngo[9, 14] == 0) Console.Write(" "); else Console.Write(" | ");
- if (ngo[4, 14] == 0) Console.Write(" "); else Console.Write("/");
- Console.Write("\n");
- //пятый ряд
- Console.Write(" ");
- Console.Write("(10)");
- if (ngo[10, 16] == 0) Console.Write(" "); else Console.Write("\\");
- if (ngo[5, 11] == 0) Console.Write(" "); else Console.Write("--");
- Console.Write("(11)");
- Console.Write(" ");
- Console.Write("(12)");
- if (ngo[7, 17] == 0) Console.Write(" "); else Console.Write("|");
- if (ngo[2, 18] == 0) Console.Write(" "); else Console.Write("|");
- if (ngo[17, 13] == 0) Console.Write(" "); else Console.Write("-");
- Console.Write("(13)");
- if (ngo[13, 9] == 0) Console.Write(" "); else Console.Write("/");
- if (ngo[8, 19] == 0) Console.Write(" "); else Console.Write("|");
- if (ngo[18, 14] == 0) Console.Write(" "); else Console.Write("/");
- Console.Write("(14)");
- Console.Write("\n");
- //шестой ряд
- if (ngo[19, 10] == 0) Console.Write(" "); else Console.Write(" /");
- Console.Write(" ");
- if (ngo[10, 16] == 0) Console.Write(" "); else Console.Write(" \\");
- if (ngo[11, 15] == 0) Console.Write(" "); else Console.Write("/");
- if (ngo[11, 16] == 0) Console.Write(" "); else Console.Write(" | ");
- if (ngo[16, 12] == 0) Console.Write(" "); else Console.Write(" -/");
- Console.Write(" ");
- if (ngo[7, 17] == 0) Console.Write(" "); else Console.Write("/");
- if (ngo[17, 13] == 0) Console.Write(" "); else Console.Write("/");
- if (ngo[2, 18] == 0) Console.Write(" "); else Console.Write("\\");
- Console.Write(" ");
- if ((ngo[18, 14] == 0) && (ngo[8, 19] == 0)) Console.Write(" ");
- else if ((ngo[18, 14] == 0) && (ngo[8, 19] != 0)) Console.Write(" -\\");
- else if ((ngo[18, 14] != 0) && (ngo[8, 19] == 0)) Console.Write(" | "); else Console.Write(" +\\");
- Console.Write("\n");
- //седьмой ряд
- if (ngo[10, 19] == 0) Console.Write(" "); else Console.Write(" |");
- Console.Write("(15)");
- if (ngo[15, 11] == 0) Console.Write(" "); else Console.Write("--");
- if (ngo[10, 16] == 0) Console.Write(" "); else Console.Write("\\");
- Console.Write("(16)");
- if (ngo[16, 12] == 0) Console.Write(" "); else Console.Write("/ ");
- Console.Write("(17)");
- if (ngo[13, 17] == 0) Console.Write(" "); else Console.Write("- ");
- Console.Write("(18)");
- if (ngo[18, 14] == 0) Console.Write(" "); else Console.Write("/ ");
- Console.Write("(19)");
- Console.Write("\n");
- //восьмой ряд
- if (ngo[10, 19] == 0) Console.Write(" "); else Console.Write(" |");
- if (ngo[15, 17] == 0) Console.Write(" "); else Console.Write(" \\__________/ ");
- if (ngo[17, 19] == 0) Console.Write(" "); else Console.Write("\\__________/ ");
- if (ngo[10, 19] == 0) Console.Write(" "); else Console.Write("/");
- Console.Write("\n");
- //девятый ряд
- if (ngo[10, 19] == 0) Console.Write(" "); else Console.Write(" \\____________________________/");
- Console.Write("\n");
- continue;
- }
- //конец Прима
- //начало матрица вершин
- for (int i = 0; i < 20; i++) for (int j = 0; j < 20; j++)
- {
- W[i, j] = 99;
- }
- for (int i = 0; i < 20; i++) for (int j = 0; j < og[i].Length / 2; j++) W[i, og[i][j, 0]] = og[i][j, 1];
- if (change == 6)
- {
- fw();
- Console.Write("Кратчайшие пути между всеми вершинами:\n");
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < 20; j++)
- {
- if (W[i, j] < 10) Console.Write(" ");
- Console.Write(W[i, j] + " ");
- }
- Console.Write("\n");
- }
- continue;
- }
- //конец матрица вершин
- //начало Форда-Фалкенсона
- if (change == 7)
- {
- Console.Write("\nНомер истока(0-19):\n");
- str = Console.ReadLine();
- n = int.Parse(str);
- int n1;
- Console.Write("\nНомер стока(0-19):\n");
- str = Console.ReadLine();
- n1 = int.Parse(str);
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < og[i].Length / 2; j++)
- {
- { f[i, og[i][j, 0]] = og[i][j, 1]; }
- }
- }
- int l = ff(n, n1);
- Console.Write("\nМаксимальный поток:" + l + "\n");
- continue;
- }
- //конец Форда-Фалкенсона
- //Дейкстра
- if (change == 9)
- {
- for (int i = 0; i < 20; i++) for (int j = 0; j < 20; j++)
- {
- dec[i, j] = 99;
- }
- for (int i = 0; i < 20; i++)
- {
- for (int j = 0; j < og[i].Length / 2; j++)
- {
- { dec[i, og[i][j, 0]] = og[i][j, 1]; }
- }
- }
- Console.Write("\nНомер вершины(0-19):\n");
- str = Console.ReadLine();
- n = int.Parse(str);
- adec(n);
- Console.Write("\nВершина:\n");
- for (int i = 0; i < 20; i++)
- {
- if (i < 10) Console.Write(" ");
- Console.Write(i + " ");
- }
- Console.Write("\n");
- for (int i = 0; i < 20; i++)
- {
- if (d1[i] < 10) Console.Write(" ");
- Console.Write(d1[i] + " ");
- }
- Console.Write("\n-Путь из вершины\n");
- continue;
- }
- //Дейкстра
- Console.Read();
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment