Переписать программу, чтобы выводило максимальное дерево графа - C#

Узнай цену своей работы

Формулировка задачи:

Нужна помощь, исправьте программу чтобы во вкладке Остновный лес, выводился максимальный граф. Скрин, и проект прилагаю. Текст программы не помещается в сообщении, 2 половина в коментарии.
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Xml;
  10. using System.Collections;
  11. namespace WindowsFormsApplication4
  12. {
  13. public partial class Form1 : Form
  14. {
  15. int n = 1;
  16. float[,] a, a1;
  17. ArrayList koord = new ArrayList();
  18. public Form1()
  19. {
  20. InitializeComponent();
  21. }
  22. private void control()
  23. {
  24. a = new float[n, n];
  25. a1 = new float[n, n];
  26. bool flag = true;
  27. for (short i = 0; i < n; i++)
  28. for (short j = 0; j < n; j++)
  29. try
  30. {
  31. a[i, j] = Convert.ToSingle(dataGridView1[j, i].Value);
  32. }
  33. catch
  34. {
  35. a[i, j] = 0;
  36. flag = false;
  37. }
  38. if (flag == false)
  39. {
  40. MessageBox.Show("Введенное вами значение имеет некорректный формат", "Ошибкa");
  41. return;
  42. }
  43. for (short i = 0; i < n; i++)
  44. for (short j = 0; j < n; j++)
  45. a1[i, j] = Convert.ToSingle(dataGridView2[j, i].Value);
  46. }
  47. private void numericUpDown1_ValueChanged(object sender, EventArgs e)
  48. {
  49. n = (byte)numericUpDown1.Value;
  50. dataGridView1.ColumnCount = n;
  51. dataGridView1.RowCount = n;
  52. dataGridView2.ColumnCount = n;
  53. dataGridView2.RowCount = n;
  54. for (short i = 0; i < n; i++)
  55. {
  56. dataGridView1[i, i].Style.BackColor = Color.Gray;
  57. dataGridView1[i, i].Value = 0;
  58. dataGridView1[i, i].ReadOnly = true;
  59. dataGridView2[i, i].Style.BackColor = Color.Gray;
  60. dataGridView2[i, i].Value = 0;
  61. dataGridView2[i, i].ReadOnly = true;
  62. }
  63. }
  64. private void Form1_Load(object sender, EventArgs e)
  65. {
  66. numericUpDown1_ValueChanged(sender, e);
  67. button1.Enabled = false;
  68. построитьToolStripMenuItem.Enabled = false;
  69. button2.Enabled = false;
  70. progressBar1.Hide();
  71. }
  72. private void button2_Click(object sender, EventArgs e)
  73. {
  74. progressBar1.Show();
  75. progressBar1.Maximum = n * n;
  76. progressBar1.Value = 0;
  77. Random x = new Random();
  78. for (short i = 0; i < n; i++)
  79. for (short j = 0; j < n; j++)
  80. {
  81. progressBar1.Value++;
  82. if (i != j)
  83. {
  84. dataGridView1[i, j].Value = x.Next(0, 20);
  85. }
  86. }
  87. progressBar1.Value = progressBar1.Maximum;
  88. progressBar1.Value = progressBar1.Minimum;
  89. progressBar1.Hide();
  90. }
  91. private void button3_Click(object sender, EventArgs e)
  92. {
  93. if (MessageBox.Show("Вы действительно хотите сбросить старые результаты?", "Подтверждение выбора", MessageBoxButtons.YesNo) == DialogResult.Yes)
  94. {
  95. progressBar1.Show();
  96. progressBar1.Value = 0;
  97. progressBar1.Maximum = 2 * n * n;
  98. for (short i = 0; i < n; i++)
  99. {
  100. for (short j = 0; j < n; j++)
  101. {
  102. progressBar1.Value++;
  103. if (i != j)
  104. {
  105. dataGridView1[i, j].Value = null;
  106. dataGridView2[i, j].Value = null;
  107. a[i, j] = 0;
  108. a1[i, j] = 0;
  109. }
  110. }
  111. }
  112. koord.Clear();
  113. n = 1;
  114. numericUpDown1.Value = n;
  115. pictureBox1.Invalidate();
  116. pictureBox2.Invalidate();
  117. progressBar1.Value = 0;
  118. button1.Enabled = false;
  119. progressBar1.Value = progressBar1.Maximum;
  120. progressBar1.Hide();
  121. }
  122. }
  123. private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
  124. {
  125. if (e.ColumnIndex == e.RowIndex)
  126. e.Cancel = true;
  127. }
  128. private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
  129. {
  130. bool flag1 = true;
  131. button1.Enabled = true;
  132. try
  133. {
  134. Convert.ToDouble(dataGridView1[e.ColumnIndex, e.RowIndex].Value);
  135. dataGridView1[e.ColumnIndex, e.RowIndex].Style.ForeColor = Color.Black;
  136. }
  137. catch
  138. {
  139. dataGridView1[e.ColumnIndex, e.RowIndex].Style.ForeColor = Color.Red;
  140. toolStripStatusLabel1.Text = "Ошибка в красной ячейке (" + (e.RowIndex + 1) + "," + (e.ColumnIndex + 1) + ")";
  141. flag1 = false;
  142. }
  143. if (flag1)
  144. dataGridView1[e.RowIndex, e.ColumnIndex].Value = dataGridView1[e.ColumnIndex, e.RowIndex].Value;
  145. построитьToolStripMenuItem.Enabled = true;
  146. pictureBox1.Invalidate();
  147. }
  148. private void button1_Click(object sender, EventArgs e)
  149. {
  150. progressBar1.Show();
  151. progressBar1.Value = 0;
  152. if (n <= 2)
  153. progressBar1.Maximum = 16;
  154. else
  155. progressBar1.Maximum = n*n*n*n/2;
  156. control();
  157. a1 = new float[n, n]; //Матрица весов окончательной матрицы
  158. short[,] b = new short[n, n]; //Массив компонент (двумерный)
  159. float[] c; //Массив ребер (вещественный)
  160. progressBar1.Value++;
  161. for (short i = 0; i < n; i++)
  162. for (short j = 0; j < n; j++)
  163. b[i, j] = -1;
  164. progressBar1.Value++;
  165. //Заполнение массива компонент (первая строка)
  166. for(short i = 0; i < n; i++)
  167. b[0, i] = i;
  168. progressBar1.Value++;
  169. short re = 0;
  170. //Проверка числа ребер
  171. for(short i = 0; i < n; i++)
  172. for(short j = 0; j < i; j++)
  173. if(a[i, j] != 0)
  174. re++;
  175. c = new float[re];
  176. re = 0;
  177. progressBar1.Value++;
  178. //Добавление ребер в массив ребер
  179. for(short i = 0; i < n; i++)
  180. for(short j = 0; j < i; j++)
  181. if(a[i, j] != 0)
  182. {
  183. c[re] = a[i, j];
  184. re++;
  185. }
  186. progressBar1.Value++;
  187. //Упорядочение массива ребер по возрастанию
  188. float g; //Обменник (вещественная переменная)
  189. short l;
  190. while(true)
  191. {
  192. l = 0;
  193. for(short i = 1; i < re; i++)
  194. {
  195. if(c[i] < c[i - 1])
  196. {
  197. g = c[i - 1];
  198. c[i - 1] = c[i];
  199. c[i] = g;
  200. l++;
  201. }
  202. }
  203. if(l == 0)
  204. break;
  205. }
  206. progressBar1.Value++;
  207. //Выполнение алгоритма
  208. short com1 = 0, com2 = 0, n3;
  209. bool flag = false;
  210. for(short k = 0; k < re; k++)
  211. { //Поиск ребра в матрице весов
  212. for (short i = 0; i < n; i++)
  213. for (short j = 0; j < i; j++)
  214. {
  215. progressBar1.Value++;
  216. if (c[k] == a[i, j] && c[k] != a1[i, j])
  217. {
  218. //Проверка вершин на принадлежность разным компонентам
  219. flag = false;
  220. for (short n1 = 0; n1 < n; n1++)
  221. {
  222. for (short n2 = 0; n2 < n; n2++)
  223. if (i == b[n1, n2])
  224. {
  225. com1 = n2;
  226. flag = true;
  227. }
  228. if (flag)
  229. break;
  230. }
  231. flag = false;
  232. for (short n1 = 0; n1 < n; n1++)
  233. {
  234. for (short n2 = 0; n2 < n; n2++)
  235. if (j == b[n1, n2])
  236. {
  237. com2 = n2;
  238. flag = true;
  239. }
  240. if (flag)
  241. break;
  242. }
  243. if (com1 != com2)
  244. { //Добавление ребра в остовый лес
  245. a1[i, j] = c[k];
  246. a1[j, i] = c[k];
  247. //Обьединение двух соединенных компонент в одну
  248. n3 = 0;
  249. for (short t = 0; t < n; t++)
  250. if (b[t, com1] == -1)
  251. {
  252. while (b[n3, com2] != -1)
  253. {
  254. b[n3 + t, com1] = b[n3, com2];
  255. b[n3, com2] = -1;
  256. n3++;
  257. }
  258. break;
  259. }
  260. }
  261. }
  262. }
  263. //Изьятие использованного ребра из массива ребер
  264. c[k] = 0;
  265. }
  266. progressBar1.Value++;
  267. //На выходе получаем матрицу остовного леса
  268. for (short i = 0; i < n; i++)
  269. for (short j = 0; j < n; j++)
  270. {
  271. dataGridView2[i, j].Value = a1[i, j];
  272. dataGridView2[j, i].Value = a1[i, j];
  273. }
  274. progressBar1.Value++;
  275. progressBar1.Value++;
  276. progressBar1.Value = progressBar1.Maximum;
  277. progressBar1.Value = progressBar1.Minimum;
  278. progressBar1.Hide();
  279. pictureBox2.Invalidate();
  280. }
  281. private void выходToolStripMenuItem_Click(object sender, EventArgs e)
  282. {
  283. Application.Exit();
  284. }
  285. private void построитьToolStripMenuItem_Click(object sender, EventArgs e)
  286. {
  287. button1_Click(sender, e);
  288. }
  289. private void слЧислаToolStripMenuItem_Click(object sender, EventArgs e)
  290. {
  291. button2_Click(sender, e);
  292. }
  293. private void сбросToolStripMenuItem_Click(object sender, EventArgs e)
  294. {
  295. button3_Click(sender, e);
  296. }
  297. private void сохранитьГрафToolStripMenuItem_Click(object sender, EventArgs e)
  298. {
  299. Point[] pnt = (Point[])koord.ToArray(typeof(Point));
  300. int[] x = new int[pnt.Length];
  301. int[] y = new int[pnt.Length];
  302. for (int i = 0; i < pnt.Length; i++)
  303. {
  304. x[i] = pnt[i].X;
  305. y[i] = pnt[i].Y;
  306. }
  307. progressBar1.Maximum = 2 * n * n;
  308. progressBar1.Value = 0;
  309. control();
  310. SaveFileDialog s = new SaveFileDialog();
  311. s.DefaultExt = ".xml";
  312. s.Filter = "Граф в формате *.xml|*.xml";
  313. if (s.ShowDialog() != DialogResult.OK) return;
  314. XmlTextWriter w = new XmlTextWriter(s.FileName, null);
  315. w.Formatting = Formatting.Indented;
  316. w.WriteStartDocument();
  317. w.WriteStartElement ("Структура");
  318. w.WriteStartElement ("Неориентированный_граф");
  319. w.WriteAttributeString( "Вершин", XmlConvert.ToString(n));
  320. for (short i = 0; i < n; i++)
  321. {
  322. w.WriteStartElement("Строка_" + (i + 1));
  323. for (short j = 0; j < n; j++)
  324. {
  325. progressBar1.Value++;
  326. w.WriteAttributeString("Яч_" + (j + 1), XmlConvert.ToString(a[i, j]));
  327. }
  328. w.WriteEndElement();
  329. }
  330. w.WriteEndElement();
  331. w.WriteStartElement ("Остовый_лес");
  332. w.WriteAttributeString ("Вершин", XmlConvert.ToString(n));
  333. for (short i = 0; i < n; i++)
  334. {
  335. w.WriteStartElement ("Строка_" + (i + 1));
  336. for (short j = 0; j < n; j++)
  337. {
  338. progressBar1.Value++;
  339. w.WriteAttributeString("Яч_" + (j + 1), XmlConvert.ToString(a1[i, j]));
  340. }
  341. w.WriteEndElement();
  342. }
  343. w.WriteEndElement();
  344. w.WriteStartElement ("Массив_координат");
  345. w.WriteAttributeString ("Вершин", XmlConvert.ToString(n));
  346. w.WriteStartElement ("Координаты_x");
  347. for (short i = 0; i < n; i++)
  348. w.WriteAttributeString ("В_" + (i + 1), x[i].ToString());
  349. w.WriteEndElement();
  350. w.WriteStartElement("Координаты_y");
  351. for (short i = 0; i < n; i++)
  352. w.WriteAttributeString("В_" + (i + 1), y[i].ToString());
  353. w.WriteEndElement();
  354. w.WriteEndElement();
  355. w.WriteEndElement();
  356. w.WriteEndDocument();
  357. w.Close();
  358. progressBar1.Value = progressBar1.Maximum;
  359. progressBar1.Value = progressBar1.Minimum;
  360. progressBar1.Hide();
  361. progressBar1.Hide();
  362. }

Решение задачи: «Переписать программу, чтобы выводило максимальное дерево графа»

textual
Листинг программы
  1.         private void загрузитьГрафToolStripMenuItem_Click(object sender, EventArgs e)
  2.         {
  3.             button3_Click(sender, e);
  4.             int[] x, y;
  5.             Point pnt = new Point();
  6.             OpenFileDialog o = new OpenFileDialog();
  7.             o.DefaultExt = ".xml";
  8.             o.Filter = "Граф в формате *.xml|*.xml";
  9.             if (o.ShowDialog() != DialogResult.OK) return;
  10.             XmlTextReader r = new XmlTextReader(o.FileName);
  11.             while (r.Read() && (r.Name != "Структура"));
  12.             while (r.Read() && (r.Name != "Неориентированный_граф"));
  13.             numericUpDown1.Value = XmlConvert.ToInt32(r.GetAttribute("Вершин"));
  14.             n = (int)numericUpDown1.Value;
  15.             x = new int[n];
  16.             y = new int[n];
  17.             for (short i = 0; i < n; i++)
  18.             {
  19.                 while (r.Read() && (r.Name != "Строка_" + (i + 1))) ;
  20.                 for (short j = 0; j < n; j++)
  21.                 {
  22.                     dataGridView1[j, i].Value = XmlConvert.ToDouble(r.GetAttribute("Яч_" + (j + 1)));
  23.                 }
  24.             }
  25.             while (r.Read() && (r.Name != "Остовый_лес")) ;
  26.             for (short i = 0; i < n; i++)
  27.             {
  28.                 while (r.Read() && (r.Name != "Строка_" + (i + 1))) ;
  29.                 for (short j = 0; j < n; j++)
  30.                 {
  31.                     dataGridView2[j, i].Value = XmlConvert.ToDouble(r.GetAttribute("Яч_" + (j + 1)));
  32.                 }
  33.             }
  34.             while (r.Read() && (r.Name != "Массив_координат")) ;
  35.             while (r.Read() && (r.Name != "Координаты_x")) ;
  36.             for (short i = 0; i < n; i++)
  37.             {
  38.                 x[i] = XmlConvert.ToInt32(r.GetAttribute("В_" + (i + 1)));
  39.             }
  40.             while (r.Read() && (r.Name != "Координаты_y")) ;
  41.             for (short i = 0; i < n; i++)
  42.             {
  43.                 y[i] = XmlConvert.ToInt32(r.GetAttribute("В_" + (i + 1)));
  44.             }
  45.             for (int i = 0; i < n; i++)
  46.             {
  47.                 pnt.X = x[i];
  48.                 pnt.Y = y[i];
  49.                 koord.Add(pnt);
  50.             }
  51.             pictureBox1.Invalidate();
  52.             pictureBox2.Invalidate();
  53.         }
  54.  
  55.         private void button4_Click(object sender, EventArgs e)
  56.         {
  57.             koord.Clear();
  58.             Random z1 = new Random();
  59.             Point x = new Point();
  60.             for (short i = 0; i < n; i++)
  61.             {
  62.                 x.X = z1.Next(20, pictureBox1.ClientSize.Width - 20);
  63.                 x.Y = z1.Next(20, pictureBox1.ClientSize.Height - 20);
  64.                 koord.Add(x);
  65.             }
  66.             pictureBox1.Invalidate();
  67.         }
  68.  
  69.         private void справкаToolStripMenuItem_Click(object sender, EventArgs e)
  70.         {
  71.  
  72.         }
  73.  
  74.         public void pictureBox1_Paint(object sender, PaintEventArgs e)
  75.         {
  76.             if (koord.Count != n)
  77.                 return;
  78.             Point[] pnt = (Point[])koord.ToArray(typeof(Point));
  79.             Font ft = new Font("Times New Roman", 16);
  80.             Size sz = new Size(8, 8);
  81.             int k = 0;
  82.             control();
  83.             e.Graphics.Clear(pictureBox1.BackColor);
  84.             Graphics gr = e.Graphics;
  85.             foreach (Point pt in koord)
  86.             {
  87.                 e.Graphics.FillEllipse(Brushes.Gray, new Rectangle(pt, sz));
  88.                 e.Graphics.DrawString((k + 1).ToString(), ft, Brushes.Gray, pt.X - 20, pt.Y - 20);
  89.                 k++;
  90.             }
  91.             for (short i = 0; i < n; i++)
  92.                 for (short j = 0; j < n; j++)
  93.                     if (a[i, j] != 0)
  94.                     {
  95.                         e.Graphics.DrawLine(Pens.Gray, pnt[i].X + 4, pnt[i].Y + 4, pnt[j].X + 4, pnt[j].Y + 4);
  96.                     }
  97.             if (k >= n)
  98.                 button2.Enabled = true;
  99.             else
  100.                 button2.Enabled = false;
  101.             ft.Dispose();
  102.         }
  103.  
  104.         public void pictureBox1_MouseClick(object sender, MouseEventArgs e)
  105.         {
  106.             MouseButtons mouse = e.Button;
  107.             if (mouse == MouseButtons.Left)
  108.             {
  109.                 koord.Add(e.Location);
  110.             }
  111.             n = koord.Count;
  112.             numericUpDown1.Value = n;
  113.             pictureBox1.Invalidate();
  114.         }
  115.  
  116.         private void pictureBox2_Paint_1(object sender, PaintEventArgs e)
  117.         {
  118.             if (koord.Count != n)
  119.                 return;
  120.             Point[] pnt = (Point[])koord.ToArray(typeof(Point));
  121.             Font ft = new Font("Times New Roman", 16);
  122.             Size sz = new Size(8, 8);
  123.             int k = 0;
  124.             control();
  125.             e.Graphics.Clear(pictureBox2.BackColor);
  126.             Graphics gr = e.Graphics;
  127.             foreach (Point pt in koord)
  128.             {
  129.                 e.Graphics.FillEllipse(Brushes.Gray, new Rectangle(pt, sz));
  130.                 e.Graphics.DrawString((k + 1).ToString(), ft, Brushes.Gray, pt.X - 20, pt.Y - 20);
  131.                 k++;
  132.             }
  133.             for (short i = 0; i < n; i++)
  134.                 for (short j = 0; j < n; j++)
  135.                     if (a1[i, j] != 0)
  136.                     {
  137.                         e.Graphics.DrawLine(Pens.Gray, pnt[i].X + 4, pnt[i].Y + 4, pnt[j].X + 4, pnt[j].Y + 4);
  138.                     }
  139.             ft.Dispose();
  140.         }
  141.  
  142.         private void button2_EnabledChanged(object sender, EventArgs e)
  143.         {
  144.  
  145.         }
  146.  
  147.        
  148.     }
  149. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы