Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 10.10.2015
Сообщений: 17

Сравнить два графа по компоненте связности

19.12.2015, 20:58. Показов 1072. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно реализовать и сравнить два графа по компоненте связности.
В программе реализован алгоритм Дейкстры. Можно его переделать для поиска компоненты связности, то толком ничего не получается.
int[,] SearchMinWay(int[,] matrix)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
using System;
 
using Microsoft.Msagl.Drawing; //Граф
 
namespace WindowsFormsApplication1
{
    public partial class btn_open2 : Form
    {
        public btn_open2()
        {
            InitializeComponent();
            gViewer1.Visible = false;
            gViewer2.Visible = false;
            radioButton2.Checked = true;
            radioButton3.Checked = true;
        }
 
 
   
 
 
        //Формирование матрицы смежности
        private int[,] AdjacencyMatrix(int size, int[] g, int[] p)
        {
            int[,] arr = new int[size, size];
            int last = 0;
            for (int i = 0; i < size; i++)
            {
                while (p[i] != last)
                {
                    arr[i, g[last] - 1] = 1;
                    last++;
                }
                last = p[i];
            }
            return arr;
        }
 
        //Проверка матрицы смежности на симметричность
        private bool CheckSimetric(int[,] matrix)
        {
            int size = (int)matrix.GetLength(0);
            for (int i = 0; i < size; i++)
                for (int j = 0; j < size; j++)
                    if (matrix[i, j] != matrix[j, i]) return false;
            return true;
        }
 
 
      
 
        //Удаление висячих вершин
        void deleteTops(ref int[,] matrix)
        {
            int count;
            int n = matrix.GetLength(0);
            for (int i = 0; i < n; i++)
            {
                count = 0;
                for (int j = 0; j < n; j++)
                {
                    if (matrix[i, j] == 1) count++;
                }
 
                if (count == 1)
                {
                    for (int j = 0; j < n; j++)
                    {
                        if (matrix[i, j] == 1)
                        {
                            matrix[i, j] = 0;
                            matrix[j, i] = 0;
                        }
                    }
                }
            }
        }
 
        //Нахождение матрицы кратчайших путей с помощью алгоритма Дейкстры
        int[,] SearchMinWay(int[,] matrix)
        {
            int n = matrix.GetLength(0);
            int v;
            int infinity = 1000;
            int[] x = new int[n]; //Массив, содержащий единицы и нули для каждой вершины,
            // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
            // x[i]=1 - кратчайший путь в i-ю вершину уже найден
            int[] Length = new int[n]; //t[i] - длина кратчайшего пути от вершины s в i
            int[,] D = new int[n, n];
            int comp = 0;
            int start = 0;                       // Номер исходной вершины
            int end;                             // Номер конечной вершины
            for (start = 0; start < n; start++) //Нахождение путей для всех вершин
                for (int prosto = 0; prosto < n; prosto++)
                {
                    end = prosto;                    //цикл прогоняет алгоритм Дейкстры p-ое количество раз
                    if (end == start) continue;      //исключаем просчет растояния между одной и той же точкой
                    else
                    {                                         // Инициализируем начальные значения массивов
                        int u;                                // Счетчик вершин
                        for (u = 0; u < n; u++)
                        {
                            Length[u] = infinity;                    //Сначала все кратчайшие пути из s в i 
                            //равны бесконечности
                            x[u] = 0;                                    // и нет кратчайшего пути ни для одной вершины
                        }
                        Length[start] = 0;                      // Кратчайший путь из s в s равен 0
                        x[start] = 1;                              // Для вершины s найден кратчайший путь
                        v = start;                                 // Делаем s текущей вершиной
 
                        while (true)
                        {
                            // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
                            for (u = 0; u < n; u++)
                            {
                                if (matrix[v, u] == 0) continue;      // Вершины u и v несмежные
                                if (x[u] == 0 && Length[u] > Length[v] + matrix[v, u]) //Если для вершины 'u' еще не 
                                //найден кратчайший путь
                                // и новый путь в 'u' короче чем 
                                //старый, то
                                {
                                    Length[u] = Length[v] + matrix[v, u];
                                    comp++;//запоминаем более короткую длину пути в
                                    //массив t[и]                                                 
                                }
                            }
 
                            // Ищем из всех длин некратчайших путей самый короткий
                            int w = infinity;                   // Для поиска самого короткого пути
                            v = -1;                             // В конце поиска v - вершина, в которую будет 
                            // найден новый кратчайший путь. Она станет 
                            // текущей вершиной
                            for (u = 0; u < n; u++)                  // Перебираем все вершины.
                            {
                                if (x[u] == 0 && Length[u] < w)  // Если для вершины не найден кратчайший 
                                // путь и если длина пути в вершину 'u' меньше
                                // уже найденной, то
                                {
                                    v = u;                         // текущей вершиной становится 'u'-я вершина
                                    w = Length[u];
                                }
                            }
 
                            if (v == -1)
                            {
                                Console.WriteLine("Нет пути из вершины X" + (start + 1) + " в вершину X" + (end + 1) + ".");
                                //rBox_MinWay.Text += "Нет пути из вершины X" + (start + 1) + " в вершину X" + (end + 1) + ".";
                                break;
                            }
 
                            if (v == end)                     // Найден кратчайший путь,
                            {
                                //rBox_MinWay.Text += "\nКратчайший путь из вершины X" + (start + 1) + " в вершину X" + (end + 1) + ":\n";
                                //u = end;
                                D[start, end] = Length[end];
                                //rBox_MinWay.Text += "\nДлина пути - " + Length[end] + "\n";
                                break;
                            }
                            x[v] = 1;
                        }
                    }
                }
            return D;
        }
 
        //Нахождение максимального кратчайшего пути для каждой из вершин
        int[] SearchMax(int[,] matrix)
        {
            int n = matrix.GetLength(0);
            int max = matrix[0, 0]; //делаем первый элемент максимальный
            int[] maxVec = new int[n]; //вектор максимальных путей
 
            for (int i = 0; i < n; i++) //нахождение максимального пути для каждой из вершин
            {
                max = matrix[i, 0];
                for (int j = 0; j < n; j++)
                {
                    if (matrix[i, j] > max) max = matrix[i, j];
                }
                maxVec[i] = max;
            }
            return maxVec;
        }
 
        //Нахождение центральных вершин
        int[] SearchMiddleTop(int[] maxVec)
        {
            int min = maxVec[0]; //делаем первый элемент минимальным
            int[] result = { }; //вектор центральных вершин
            for (int i = 0; i < maxVec.Length; i++) //Находим минимальные пути в векторе максимальных
            {
                if (maxVec[i] < min) min = maxVec[i];
            }
            int n = 0;
            for (int i = 0; i < maxVec.Length; i++) //Формируем массив центральных вершин
            {
                if (maxVec[i] == min) { Array.Resize(ref result, result.Length + 1); result[n] = i; n++; }
            }
            return result;
        }
 
        //Считывание с файла
        private void InputFile(NumericUpDown cn, NumericUpDown cm, TextBox cg, TextBox cp)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    StreamReader sr = new StreamReader(openFileDialog1.FileName);
                    string s = sr.ReadToEnd();
                    sr.Close();
                    var l = from w in s.Split('\n') select w;
                    int nn = 0;
                    foreach (var el in l)
                    {
                        nn++;
                        if (nn == 1)
                        {
                            string[] n = el.Split(' ');
                            if (int.Parse(n[0]) > 20 || int.Parse(n[0]) < 1) { MessageBox.Show("Ошибка ввода количества вершин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); break; }
                            cn.Value = Convert.ToDecimal(n[0]);
                            if (int.Parse(n[1]) > 50 || int.Parse(n[1]) < 0) { MessageBox.Show("Ошибка ввода количества ребер", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); break; }
                            cm.Value = Convert.ToDecimal(n[1]);
                        }
                        if (nn == 2)
                            cg.Text = el.Trim(' ');
                        if (nn == 3)
                            cp.Text = el.Trim(' ');
                    }
                }
                catch
                {
                    MessageBox.Show("Ошибка считывания!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
 
        //Кнопка "Вычислить"
        private void btn_calc_Click_1(object sender, EventArgs e)
        {
            try
            {
                //Первый граф
                int n1 = (int)nmr_n1.Value; //количество вершин          
                int m1 = (int)nmr_m1.Value; //количество ребер 
 
                int[] g1 = new int[m1]; //MFО представление
                int[] p1 = new int[n1];     //
 
                ConversionFrom(ref g1, tb_g1); //считывание с формы
                ConversionFrom(ref p1, tb_p1); //
 
                CheckG(n1, m1, g1, 1); //проверка матрицы G
                CheckP(n1, m1, p1, 1); //проверка матрицы P
 
                int[,] matrix1 = AdjacencyMatrix(n1, g1, p1); //Создание матрицы смежности
 
                if (!CheckSimetric(matrix1)) throw new Exception("Матрица смежности 1-ого графа не симметрична!");
 
 
 
                deleteTops(ref matrix1); //удаление висячих вершин
 
                int[,] D1 = SearchMinWay(matrix1); //создание матрицы кратчайших путей
 
                int[] max1 = SearchMax(D1); //вектор максимальных путей для каждой вершины
                 
                int[] MiddleTop1 = SearchMiddleTop(max1); //поиск центральных вершин
 
                //Второй граф
                int n2 = (int)nmr_n2.Value; //количество вершин
                int m2 = (int)nmr_m2.Value; //количество ребер
 
                int[] p2 = new int[n2];     //MFO представление
                int[] g2 = new int[m2]; //
 
                ConversionFrom(ref g2, tb_g2); //считывание с формы
                ConversionFrom(ref p2, tb_p2); //
 
                CheckG(n2, m2, g2, 2); //проверка элементов массива G
                CheckP(n2, m2, p2, 2); //проверка элементов массива P
 
                int[,] matrix2 = AdjacencyMatrix(n2, g2, p2); //создание матрицы смежности
 
                if (!CheckSimetric(matrix2)) throw new Exception("Матрица смежности 2-ого графа не симметрична!");
 
                deleteTops(ref matrix2); //удаление висячих вершин
 
 
                int[,] D2 = SearchMinWay(matrix2); //создание матрицы кратчайших путей
 
                int[] max2 = SearchMax(D2); //вектор максимальных путей для каждой вершины
 
                int[] MiddleTop2 = SearchMiddleTop(max2); //поиск центральных вершин
 
                //Сравнивание графов по
                string s;
                if (MiddleTop1.Length == MiddleTop2.Length)
                    s = "Графы эквивалентны";
                else s = "Графы не эквивалентны";
                MessageBox.Show(s, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 
        }
   
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2015, 20:58
Ответы с готовыми решениями:

Определение связности графа
Добрый день! столькнулся с задачей определения связанности графа, исходные данные вершина - свзязи Помогите с алгоритмом

Поиск компонент связности графа
Помогите, пожалуйста, исправить ошибки в коде... Лабораторная работа № 5 Поиск компонент связности графа Граф задан его матрицей...

Поиск компонент связности графа
Ребята, подправьте пожалуйста вот эту работу. Препод написал , что работает неправильно и не выполняет условия задания. Помогите! ...

1
0 / 0 / 0
Регистрация: 04.11.2017
Сообщений: 1
04.11.2017, 22:08
привет, если не трудно, можете скинуть исходники!? Если конечно где-то завалялось. Или оформление проджикта!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2017, 22:08
Помогаю со студенческими работами здесь

Поиск компонент связности графа
Граф задан его матрицей смежности. Требуется определить количество компонент связности этого графа . При этом должны быть конкретно...

Число вершин связности графа
Помогите пожалуйста мне надо написать прогу по нахождению Числа вершин связности графа я уже наверно месяц не могу не чего толкового...

Посчитать количество компонент связности графа
Дан неориентированный невзвешенный граф. Необходимо посчитать количество его компонент связности и вывести их. Входные данные Во...

Определить степень связности неориентированного графа.
Помогите пожалуйста с решением задачи: Необходимо определить степень связности неориентированного графа. Под степенью связности...

Посчитать количество компонент связности графа
Дан граф. Необходимо посчитать количество его компонент связности и вывести их. Добавлено через 10 минут пример input.txt 15 11 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru