Автор работы: Пользователь скрыл имя, 29 Мая 2013 в 17:43, курсовая работа
Задача о нахождении минимального остовного дерева часто встречается в подобной постановке: есть n городов, через которые можно проложить маршрут так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города). Требуется найти такой маршрут, чтобы стоимость проезда была максимальной.
fori¬1 to N
тело Û
end;
Таким образом конструкция цикла требует 1+3*N элементарных операций:
F«цикл» = 1+3*N+N*f«тела цикла».
2 Разработка технологии
2.1 Блок схема программы и ее описание.
Рис.3.Блок-схема алгоритма задачи моделирования
Описание блок-схемы алгоритма задачи моделирования
Блок 1. Ввод матрицы весов ребер графа. Запись графа в память компьютера осуществляется при помощи двумерного массива, который служит матрицей весов ребер графа.
Блок 2. Ввод вершины поиска. После заполнения матрицы весов пользователем программа автоматически определяет вершину начала построения остова.
Блок 3. Поиск ребра минимального веса среди инцидентных n ребер. Программа анализирует матрицу весов и находит ребро с минимальным весом. Найденное ребро сохраняется в переменнуюmin.
Блок 4. Формирование остова. Формируется остов.
Блок
5.Выбор новой инцидентной
Блок 6. Все вершины графа помечены. Если все вершины графа помечены, то поиск остова заканчивается. Если нет, то среди инцидентных помеченным вершинам ребер, за исключением ребер остова и ребер, образующих в остов цикл, происходит поиск ребра минимального веса min и построение остова.
Блок 7. Вывод остова. После того как все вершины графа помечены, на монитор пользователя выводится остов минимального веса.
Блок 8. Инцидентные помеченным вершинам ребра. Если есть такие ребра, то программа анализирует найденные ребра, если нет инцидентных ребер, то программа переходит к Блоку 6.
Блок 9. Ребра остова. Найденное ребро не используется в остове, то программа переходит к Блоку 10, а если используется, то переходит к Блоку 6.
Блок 10. Образует ребро в остове цикл, если да то программа переходит к Блоку 6. Если ребро не образует в остове цикл, то программа переходит к Блоку11.
Блок
11. Нахождение ребра минимального веса.
Программа анализирует
Блок 12. Формирование остова. Программа формирует полученный остов, проверяется связанность ребер с вершинами графа, за это отвечает массивсвязанности ar[jmin, imin], если он равен единицам, то все ребра связаны с вершинами, если он не равен единице, то продолжается формирование остова.
Блок
13. Выбор новой инцидентной
2.2 Код программы.
using System;
usingSystem.Collections.
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Xml;
usingSystem.Collections;
namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
int n = 1;
float[,] a, a1;
ArrayListkoord = 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(
}
catch
{
a[i, j] = 0;
flag = false;
}
if (flag == false)
{
MessageBox.Show("Введенное
вами значение имеет
return;
}
for (short i = 0; i< n; i++)
for (short j = 0; j < n; j++)
a1[i, j] = Convert.ToSingle(
}
private void numericUpDown1_ValueChanged(
{
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(
button1.Enabled = false;
построитьToolStripMenuItem.
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("
{
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(
{
if (e.ColumnIndex == e.RowIndex)
e.Cancel = true;
}
private void dataGridView1_
{
bool flag1 = true;
button1.Enabled = true;
try
{
Convert.ToDouble(
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.
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 = newfloat[n, n]; //Матрица весов окончательной матрицы
short[,] b = newshort[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])
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])
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(
{
Application.Exit();
}
private void построитьToolStripMenuItem_
{
button1_Click(sender, e);
}
private void слЧислаToolStripMenuItem_
{
button2_Click(sender, e);
}
private void сбросToolStripMenuItem_Click(
{
button3_Click(sender, e);
}
private void сохранитьГрафToolStripMenuItem
{
Point[] pnt = (Point[])koord.ToArray(typeof(
int[] x = new int[pnt.Length];
int[] y = new int[pnt.Length];
for (inti = 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("
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();
}
private void загрузитьГрафToolStripMenuItem
{
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.
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.
}
}
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.
}
}
while (r.Read() && (r.Name != "Массив_координат")) ;
while (r.Read() && (r.Name != "Координаты_x")) ;
for (short i = 0; i< n; i++)
{
x[i] = XmlConvert.ToInt32(r.
}
while (r.Read() && (r.Name != "Координаты_y")) ;
for (short i = 0; i< n; i++)
{
y[i] = XmlConvert.ToInt32(r.
}
for (inti = 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_
{
}
public void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (koord.Count != n)
return;
Point[] pnt = (Point[])koord.ToArray(typeof(