public void DoIt() { var helpList = new int[_graf.GetVertexCount()]; foreach (var edge in _graf.GetEdgeList()) { helpList[edge.StartVertex - 1]++; helpList[edge.FinishVertex - 1]++; } var counter = 0; foreach (var numOfVertex in helpList) { if (numOfVertex == 0) { _result = "Нет Эйлерова цикла, граф несвязный"; return; } counter += numOfVertex % 2; } var floyd = new Floyd(_graf); var flag = true; foreach (var edge in floyd.Matrix) { if (edge > 99999) { flag = false; } } if (flag) { if (counter == 0) { _result = "Есть Эйлеров цикл"; if (_mainDrawer.GetCheckedVetex() < 0) { return; } _mainDrawer.TimingDraw(GetEdgeList()); return; } else { _result = "Нет Эйлерова цикла, есть вершины с нечетной степенью"; return; } } else { _result = "Нет Эйлерова цикла, граф несвязный"; return; } }
/// <summary> /// Отрисовка графа на форме /// </summary> /// <param name="data">Модель данных</param> public void Draw(GrafData data) { _mainDrawer.Draw(data); var edgeList = new List <EdgeForDGW>(); foreach (var edge in _graf.GetEdgeList()) { edgeList.Add(new EdgeForDGW { Start = edge.StartVertex, Finish = edge.FinishVertex, Weight = edge.Weight }); } AddEdgeEvent?.Invoke(edgeList); }
internal static int[,] GetMatrix(Graf graf) { var count = graf.GetVertexCount(); var matrix = new int[count, count]; foreach (var edge in graf.GetEdgeList()) { if (edge.Route) { matrix[edge.StartVertex - 1, edge.FinishVertex - 1] = edge.Weight; } else { matrix[edge.StartVertex - 1, edge.FinishVertex - 1] = edge.Weight; matrix[edge.FinishVertex - 1, edge.StartVertex - 1] = edge.Weight; } } return(matrix); }
public void DoIt() { var matrix = ConvertToMatrix.GetMatrix(_graf); var copyMatrix = ConvertToMatrix.GetMatrix(_graf); var start = _mainDrawer.GetVertexForDej() - 1; var finish = _mainDrawer.GetVertexForDej() - 1; for (var i = 0; i < matrix.GetLength(0); i++) { for (var j = 0; j < matrix.GetLength(0); j++) { if (matrix[i, j] == 0) { matrix[i, j] = 999999999; copyMatrix[i, j] = 999999999; } } } var changed = true; while (changed) { changed = false; for (var i = 0; i < matrix.GetLength(0); i++) { for (var j = 0; j < matrix.GetLength(0); j++) { for (var k = 0; k < matrix.GetLength(0); k++) { if (matrix[i, j] > matrix[i, k] + matrix[k, j]) { matrix[i, j] = matrix[i, k] + matrix[k, j]; changed = true; } } } } } _result = matrix[start, finish].ToString(); for (var i = 0; i < matrix.GetLength(0); i++) { matrix[i, i] = 0; } var vertexList = new List <int>(); var s = matrix[start, finish]; while (s > 0) { for (var i = 0; i < copyMatrix.GetLength(0); i++) { if (copyMatrix[i, finish] < 10000) { if (s - copyMatrix[i, finish] == matrix[start, i]) { s -= copyMatrix[i, finish]; vertexList.Add(finish + 1); finish = i; break; } } } } vertexList.Add(start + 1); vertexList.Reverse(); var edgeList = new List <Edge>(); for (var i = 0; i < vertexList.Count - 1; i++) { var edge = _graf.GetEdgeList().FirstOrDefault(e => e.StartVertex == vertexList[i] && e.FinishVertex == vertexList[i + 1]); if (edge != null) { edgeList.Add(edge); } } _mainDrawer.TimingDraw(edgeList); }