using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Lab4 { public partial class Title : Form { private List textBoxes = new List(); //Список Текстбоксов формы для случайного заполнения и проверки входных данных private List edges = new List(); //список дуг private List[] vertexes = new List[6];//список вершин public Title() { InitializeComponent(); textBoxes.Add(edge0WeigntTextBox); textBoxes.Add(edge1WeigntTextBox); textBoxes.Add(edge2WeigntTextBox); textBoxes.Add(edge3WeigntTextBox); textBoxes.Add(edge4WeigntTextBox); textBoxes.Add(edge5WeigntTextBox); textBoxes.Add(edge6WeigntTextBox); textBoxes.Add(edge7WeigntTextBox); for (int i = 0; i < 6; ++i) { vertexes[i] = new List(); } InitializeNetwork(); RandomFilling(); } private void InitializeNetwork() { edges.Add(new Edge(0, 0, 1, 0)); vertexes[0].Add(edges[0]); vertexes[1].Add(edges[0]); edges.Add(new Edge(1, 0, 2, 0)); vertexes[0].Add(edges[1]); vertexes[2].Add(edges[1]); edges.Add(new Edge(2, 0, 3, 0)); vertexes[0].Add(edges[2]); vertexes[3].Add(edges[2]); edges.Add(new Edge(3, 1, 2, 0)); vertexes[1].Add(edges[3]); vertexes[2].Add(edges[3]); edges.Add(new Edge(4, 2, 3, 0)); vertexes[2].Add(edges[4]); vertexes[3].Add(edges[4]); edges.Add(new Edge(5, 3, 4, 0)); vertexes[3].Add(edges[5]); vertexes[4].Add(edges[5]); edges.Add(new Edge(6, 3, 5, 0)); vertexes[3].Add(edges[6]); edges.Add(new Edge(7, 4, 5, 0)); vertexes[4].Add(edges[7]); } //создание сети по условию private bool CheckInData() { bool result = true; byte tempVar; for (byte i = 0; i < textBoxes.Count; ++i) { if (!(byte.TryParse(textBoxes[i].Text, out tempVar))) { textBoxes[i].BackColor = Color.Red; result = false; } else { textBoxes[i].BackColor = Color.White; } } return result; } //проверка входных данных private void RandomFilling() { Random randomVar = new Random(); byte tempVar; for (byte i = 0; i < textBoxes.Count; ++i) { tempVar = (byte)randomVar.Next(1, 20); textBoxes[i].Text = tempVar.ToString(); edges[i].Weight = tempVar; } }//случайное заполнение private bool GetChain(out List resultEdgeWay) { List> resultVertexWay = new List>(); List workVertex = new List(); List> visitedVertexes = new List>(); resultEdgeWay = new List(); resultVertexWay.Add(vertexes[0]); workVertex = vertexes[0]; visitedVertexes.Add(vertexes[0]); while (workVertex != vertexes.Last()) { bool checkAddWayElement = false; for (byte i = 0; i < workVertex.Count; ++i) { bool checkVisitedVertexes = false; for (byte i2 = 0; i2 < visitedVertexes.Count; ++i2) { if (vertexes[workVertex[i].WereVertex] == visitedVertexes[i2]) { checkVisitedVertexes = true; } } if (workVertex[i].Flow < workVertex[i].Weight && !checkVisitedVertexes) { resultEdgeWay.Add(workVertex[i]); workVertex = vertexes[workVertex[i].WereVertex]; resultVertexWay.Add(workVertex); visitedVertexes.Add(workVertex); checkAddWayElement = true; break; } } if (!checkAddWayElement) { if (resultVertexWay.Count == 1) { return false; } resultVertexWay.Remove(resultVertexWay.Last()); resultEdgeWay.Remove(resultEdgeWay.Last()); workVertex = resultVertexWay.Last(); } } return true; } //получение увеличивающей цепи private void MaxFlow() { List currentWay = new List(); List tempListForGetMinSkipFlowDifference = new List(); byte maxFlow = 0; byte minSkipFlowDiffrenece = 0; while (GetChain(out currentWay)) { for (byte i = 0; i < currentWay.Count; ++i) { tempListForGetMinSkipFlowDifference.Add((byte)(currentWay[i].Weight - currentWay[i].Flow)); } minSkipFlowDiffrenece = tempListForGetMinSkipFlowDifference.Min(); for (byte i = 0; i < currentWay.Count; ++i) { currentWay[i].Flow += minSkipFlowDiffrenece; } maxFlow += minSkipFlowDiffrenece; } flowResultLabel.Text = maxFlow.ToString(); for (byte i = 0; i < edges.Count; ++i) { edges[i].Flow = 0; } } //получение максимального потока private void edgeWeigntTextBox_TextChanged(object sender, EventArgs e) { if (CheckInData()) { #region перенос из текстбоксов в edges[] if (((TextBox)(sender)) == textBoxes[0]) { edges[0].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[1]) { edges[1].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[2]) { edges[2].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[3]) { edges[3].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[4]) { edges[4].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[5]) { edges[5].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[6]) { edges[6].Weight = byte.Parse(((TextBox)(sender)).Text); } if (((TextBox)(sender)) == textBoxes[7]) { edges[7].Weight = byte.Parse(((TextBox)(sender)).Text); } #endregion MaxFlow(); } } private void edgeWeigntTextBox_GotFocus(object sender, EventArgs e) { ((TextBox)sender).BackColor = Color.White; //this.cancelButton.Focus(); } private void randomFillButton_Click(object sender, EventArgs e) { RandomFilling(); } private void cancelButton_Click(object sender, EventArgs e) { Environment.Exit(0); } } }