Переписать программу, чтобы выводило максимальное дерево графа - C#
Формулировка задачи:
Нужна помощь, исправьте программу чтобы во вкладке Остновный лес, выводился максимальный граф.
Скрин, и проект прилагаю.
Текст программы не помещается в сообщении, 2 половина в коментарии.
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Xml;
- using System.Collections;
- namespace WindowsFormsApplication4
- {
- public partial class Form1 : Form
- {
- int n = 1;
- float[,] a, a1;
- ArrayList koord = new ArrayList();
- public Form1()
- {
- InitializeComponent();
- }
- private void control()
- {
- a = new float[n, n];
- a1 = new float[n, n];
- bool flag = true;
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- try
- {
- a[i, j] = Convert.ToSingle(dataGridView1[j, i].Value);
- }
- catch
- {
- a[i, j] = 0;
- flag = false;
- }
- if (flag == false)
- {
- MessageBox.Show("Введенное вами значение имеет некорректный формат", "Ошибкa");
- return;
- }
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- a1[i, j] = Convert.ToSingle(dataGridView2[j, i].Value);
- }
- private void numericUpDown1_ValueChanged(object sender, EventArgs e)
- {
- n = (byte)numericUpDown1.Value;
- dataGridView1.ColumnCount = n;
- dataGridView1.RowCount = n;
- dataGridView2.ColumnCount = n;
- dataGridView2.RowCount = n;
- for (short i = 0; i < n; i++)
- {
- dataGridView1[i, i].Style.BackColor = Color.Gray;
- dataGridView1[i, i].Value = 0;
- dataGridView1[i, i].ReadOnly = true;
- dataGridView2[i, i].Style.BackColor = Color.Gray;
- dataGridView2[i, i].Value = 0;
- dataGridView2[i, i].ReadOnly = true;
- }
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- numericUpDown1_ValueChanged(sender, e);
- button1.Enabled = false;
- построитьToolStripMenuItem.Enabled = false;
- button2.Enabled = false;
- progressBar1.Hide();
- }
- private void button2_Click(object sender, EventArgs e)
- {
- progressBar1.Show();
- progressBar1.Maximum = n * n;
- progressBar1.Value = 0;
- Random x = new Random();
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- {
- progressBar1.Value++;
- if (i != j)
- {
- dataGridView1[i, j].Value = x.Next(0, 20);
- }
- }
- progressBar1.Value = progressBar1.Maximum;
- progressBar1.Value = progressBar1.Minimum;
- progressBar1.Hide();
- }
- private void button3_Click(object sender, EventArgs e)
- {
- if (MessageBox.Show("Вы действительно хотите сбросить старые результаты?", "Подтверждение выбора", MessageBoxButtons.YesNo) == DialogResult.Yes)
- {
- progressBar1.Show();
- progressBar1.Value = 0;
- progressBar1.Maximum = 2 * n * n;
- for (short i = 0; i < n; i++)
- {
- for (short j = 0; j < n; j++)
- {
- progressBar1.Value++;
- if (i != j)
- {
- dataGridView1[i, j].Value = null;
- dataGridView2[i, j].Value = null;
- a[i, j] = 0;
- a1[i, j] = 0;
- }
- }
- }
- koord.Clear();
- n = 1;
- numericUpDown1.Value = n;
- pictureBox1.Invalidate();
- pictureBox2.Invalidate();
- progressBar1.Value = 0;
- button1.Enabled = false;
- progressBar1.Value = progressBar1.Maximum;
- progressBar1.Hide();
- }
- }
- private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
- {
- if (e.ColumnIndex == e.RowIndex)
- e.Cancel = true;
- }
- private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
- {
- bool flag1 = true;
- button1.Enabled = true;
- try
- {
- Convert.ToDouble(dataGridView1[e.ColumnIndex, e.RowIndex].Value);
- dataGridView1[e.ColumnIndex, e.RowIndex].Style.ForeColor = Color.Black;
- }
- catch
- {
- dataGridView1[e.ColumnIndex, e.RowIndex].Style.ForeColor = Color.Red;
- toolStripStatusLabel1.Text = "Ошибка в красной ячейке (" + (e.RowIndex + 1) + "," + (e.ColumnIndex + 1) + ")";
- flag1 = false;
- }
- if (flag1)
- dataGridView1[e.RowIndex, e.ColumnIndex].Value = dataGridView1[e.ColumnIndex, e.RowIndex].Value;
- построитьToolStripMenuItem.Enabled = true;
- pictureBox1.Invalidate();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- progressBar1.Show();
- progressBar1.Value = 0;
- if (n <= 2)
- progressBar1.Maximum = 16;
- else
- progressBar1.Maximum = n*n*n*n/2;
- control();
- a1 = new float[n, n]; //Матрица весов окончательной матрицы
- short[,] b = new short[n, n]; //Массив компонент (двумерный)
- float[] c; //Массив ребер (вещественный)
- progressBar1.Value++;
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- b[i, j] = -1;
- progressBar1.Value++;
- //Заполнение массива компонент (первая строка)
- for(short i = 0; i < n; i++)
- b[0, i] = i;
- progressBar1.Value++;
- short re = 0;
- //Проверка числа ребер
- for(short i = 0; i < n; i++)
- for(short j = 0; j < i; j++)
- if(a[i, j] != 0)
- re++;
- c = new float[re];
- re = 0;
- progressBar1.Value++;
- //Добавление ребер в массив ребер
- for(short i = 0; i < n; i++)
- for(short j = 0; j < i; j++)
- if(a[i, j] != 0)
- {
- c[re] = a[i, j];
- re++;
- }
- progressBar1.Value++;
- //Упорядочение массива ребер по возрастанию
- float g; //Обменник (вещественная переменная)
- short l;
- while(true)
- {
- l = 0;
- for(short i = 1; i < re; i++)
- {
- if(c[i] < c[i - 1])
- {
- g = c[i - 1];
- c[i - 1] = c[i];
- c[i] = g;
- l++;
- }
- }
- if(l == 0)
- break;
- }
- progressBar1.Value++;
- //Выполнение алгоритма
- short com1 = 0, com2 = 0, n3;
- bool flag = false;
- for(short k = 0; k < re; k++)
- { //Поиск ребра в матрице весов
- for (short i = 0; i < n; i++)
- for (short j = 0; j < i; j++)
- {
- progressBar1.Value++;
- if (c[k] == a[i, j] && c[k] != a1[i, j])
- {
- //Проверка вершин на принадлежность разным компонентам
- flag = false;
- for (short n1 = 0; n1 < n; n1++)
- {
- for (short n2 = 0; n2 < n; n2++)
- if (i == b[n1, n2])
- {
- com1 = n2;
- flag = true;
- }
- if (flag)
- break;
- }
- flag = false;
- for (short n1 = 0; n1 < n; n1++)
- {
- for (short n2 = 0; n2 < n; n2++)
- if (j == b[n1, n2])
- {
- com2 = n2;
- flag = true;
- }
- if (flag)
- break;
- }
- if (com1 != com2)
- { //Добавление ребра в остовый лес
- a1[i, j] = c[k];
- a1[j, i] = c[k];
- //Обьединение двух соединенных компонент в одну
- n3 = 0;
- for (short t = 0; t < n; t++)
- if (b[t, com1] == -1)
- {
- while (b[n3, com2] != -1)
- {
- b[n3 + t, com1] = b[n3, com2];
- b[n3, com2] = -1;
- n3++;
- }
- break;
- }
- }
- }
- }
- //Изьятие использованного ребра из массива ребер
- c[k] = 0;
- }
- progressBar1.Value++;
- //На выходе получаем матрицу остовного леса
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- {
- dataGridView2[i, j].Value = a1[i, j];
- dataGridView2[j, i].Value = a1[i, j];
- }
- progressBar1.Value++;
- progressBar1.Value++;
- progressBar1.Value = progressBar1.Maximum;
- progressBar1.Value = progressBar1.Minimum;
- progressBar1.Hide();
- pictureBox2.Invalidate();
- }
- private void выходToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Application.Exit();
- }
- private void построитьToolStripMenuItem_Click(object sender, EventArgs e)
- {
- button1_Click(sender, e);
- }
- private void слЧислаToolStripMenuItem_Click(object sender, EventArgs e)
- {
- button2_Click(sender, e);
- }
- private void сбросToolStripMenuItem_Click(object sender, EventArgs e)
- {
- button3_Click(sender, e);
- }
- private void сохранитьГрафToolStripMenuItem_Click(object sender, EventArgs e)
- {
- Point[] pnt = (Point[])koord.ToArray(typeof(Point));
- int[] x = new int[pnt.Length];
- int[] y = new int[pnt.Length];
- for (int i = 0; i < pnt.Length; i++)
- {
- x[i] = pnt[i].X;
- y[i] = pnt[i].Y;
- }
- progressBar1.Maximum = 2 * n * n;
- progressBar1.Value = 0;
- control();
- SaveFileDialog s = new SaveFileDialog();
- s.DefaultExt = ".xml";
- s.Filter = "Граф в формате *.xml|*.xml";
- if (s.ShowDialog() != DialogResult.OK) return;
- XmlTextWriter w = new XmlTextWriter(s.FileName, null);
- w.Formatting = Formatting.Indented;
- w.WriteStartDocument();
- w.WriteStartElement ("Структура");
- w.WriteStartElement ("Неориентированный_граф");
- w.WriteAttributeString( "Вершин", XmlConvert.ToString(n));
- for (short i = 0; i < n; i++)
- {
- w.WriteStartElement("Строка_" + (i + 1));
- for (short j = 0; j < n; j++)
- {
- progressBar1.Value++;
- w.WriteAttributeString("Яч_" + (j + 1), XmlConvert.ToString(a[i, j]));
- }
- w.WriteEndElement();
- }
- w.WriteEndElement();
- w.WriteStartElement ("Остовый_лес");
- w.WriteAttributeString ("Вершин", XmlConvert.ToString(n));
- for (short i = 0; i < n; i++)
- {
- w.WriteStartElement ("Строка_" + (i + 1));
- for (short j = 0; j < n; j++)
- {
- progressBar1.Value++;
- w.WriteAttributeString("Яч_" + (j + 1), XmlConvert.ToString(a1[i, j]));
- }
- w.WriteEndElement();
- }
- w.WriteEndElement();
- w.WriteStartElement ("Массив_координат");
- w.WriteAttributeString ("Вершин", XmlConvert.ToString(n));
- w.WriteStartElement ("Координаты_x");
- for (short i = 0; i < n; i++)
- w.WriteAttributeString ("В_" + (i + 1), x[i].ToString());
- w.WriteEndElement();
- w.WriteStartElement("Координаты_y");
- for (short i = 0; i < n; i++)
- w.WriteAttributeString("В_" + (i + 1), y[i].ToString());
- w.WriteEndElement();
- w.WriteEndElement();
- w.WriteEndElement();
- w.WriteEndDocument();
- w.Close();
- progressBar1.Value = progressBar1.Maximum;
- progressBar1.Value = progressBar1.Minimum;
- progressBar1.Hide();
- progressBar1.Hide();
- }
Решение задачи: «Переписать программу, чтобы выводило максимальное дерево графа»
textual
Листинг программы
- private void загрузитьГрафToolStripMenuItem_Click(object sender, EventArgs e)
- {
- button3_Click(sender, e);
- int[] x, y;
- Point pnt = new Point();
- OpenFileDialog o = new OpenFileDialog();
- o.DefaultExt = ".xml";
- o.Filter = "Граф в формате *.xml|*.xml";
- if (o.ShowDialog() != DialogResult.OK) return;
- XmlTextReader r = new XmlTextReader(o.FileName);
- while (r.Read() && (r.Name != "Структура"));
- while (r.Read() && (r.Name != "Неориентированный_граф"));
- numericUpDown1.Value = XmlConvert.ToInt32(r.GetAttribute("Вершин"));
- n = (int)numericUpDown1.Value;
- x = new int[n];
- y = new int[n];
- for (short i = 0; i < n; i++)
- {
- while (r.Read() && (r.Name != "Строка_" + (i + 1))) ;
- for (short j = 0; j < n; j++)
- {
- dataGridView1[j, i].Value = XmlConvert.ToDouble(r.GetAttribute("Яч_" + (j + 1)));
- }
- }
- while (r.Read() && (r.Name != "Остовый_лес")) ;
- for (short i = 0; i < n; i++)
- {
- while (r.Read() && (r.Name != "Строка_" + (i + 1))) ;
- for (short j = 0; j < n; j++)
- {
- dataGridView2[j, i].Value = XmlConvert.ToDouble(r.GetAttribute("Яч_" + (j + 1)));
- }
- }
- while (r.Read() && (r.Name != "Массив_координат")) ;
- while (r.Read() && (r.Name != "Координаты_x")) ;
- for (short i = 0; i < n; i++)
- {
- x[i] = XmlConvert.ToInt32(r.GetAttribute("В_" + (i + 1)));
- }
- while (r.Read() && (r.Name != "Координаты_y")) ;
- for (short i = 0; i < n; i++)
- {
- y[i] = XmlConvert.ToInt32(r.GetAttribute("В_" + (i + 1)));
- }
- for (int i = 0; i < n; i++)
- {
- pnt.X = x[i];
- pnt.Y = y[i];
- koord.Add(pnt);
- }
- pictureBox1.Invalidate();
- pictureBox2.Invalidate();
- }
- private void button4_Click(object sender, EventArgs e)
- {
- koord.Clear();
- Random z1 = new Random();
- Point x = new Point();
- for (short i = 0; i < n; i++)
- {
- x.X = z1.Next(20, pictureBox1.ClientSize.Width - 20);
- x.Y = z1.Next(20, pictureBox1.ClientSize.Height - 20);
- koord.Add(x);
- }
- pictureBox1.Invalidate();
- }
- private void справкаToolStripMenuItem_Click(object sender, EventArgs e)
- {
- }
- public void pictureBox1_Paint(object sender, PaintEventArgs e)
- {
- if (koord.Count != n)
- return;
- Point[] pnt = (Point[])koord.ToArray(typeof(Point));
- Font ft = new Font("Times New Roman", 16);
- Size sz = new Size(8, 8);
- int k = 0;
- control();
- e.Graphics.Clear(pictureBox1.BackColor);
- Graphics gr = e.Graphics;
- foreach (Point pt in koord)
- {
- e.Graphics.FillEllipse(Brushes.Gray, new Rectangle(pt, sz));
- e.Graphics.DrawString((k + 1).ToString(), ft, Brushes.Gray, pt.X - 20, pt.Y - 20);
- k++;
- }
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- if (a[i, j] != 0)
- {
- e.Graphics.DrawLine(Pens.Gray, pnt[i].X + 4, pnt[i].Y + 4, pnt[j].X + 4, pnt[j].Y + 4);
- }
- if (k >= n)
- button2.Enabled = true;
- else
- button2.Enabled = false;
- ft.Dispose();
- }
- public void pictureBox1_MouseClick(object sender, MouseEventArgs e)
- {
- MouseButtons mouse = e.Button;
- if (mouse == MouseButtons.Left)
- {
- koord.Add(e.Location);
- }
- n = koord.Count;
- numericUpDown1.Value = n;
- pictureBox1.Invalidate();
- }
- private void pictureBox2_Paint_1(object sender, PaintEventArgs e)
- {
- if (koord.Count != n)
- return;
- Point[] pnt = (Point[])koord.ToArray(typeof(Point));
- Font ft = new Font("Times New Roman", 16);
- Size sz = new Size(8, 8);
- int k = 0;
- control();
- e.Graphics.Clear(pictureBox2.BackColor);
- Graphics gr = e.Graphics;
- foreach (Point pt in koord)
- {
- e.Graphics.FillEllipse(Brushes.Gray, new Rectangle(pt, sz));
- e.Graphics.DrawString((k + 1).ToString(), ft, Brushes.Gray, pt.X - 20, pt.Y - 20);
- k++;
- }
- for (short i = 0; i < n; i++)
- for (short j = 0; j < n; j++)
- if (a1[i, j] != 0)
- {
- e.Graphics.DrawLine(Pens.Gray, pnt[i].X + 4, pnt[i].Y + 4, pnt[j].X + 4, pnt[j].Y + 4);
- }
- ft.Dispose();
- }
- private void button2_EnabledChanged(object sender, EventArgs e)
- {
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д