Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 20.10.2017
Сообщений: 18

Внутрення устойчивость (максимальная плотность) графа на матрице смежности

09.11.2017, 20:09. Показов 3040. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно получить число внутренней усточивости ориентированного графа. Сам граф представлен матрицей смежности.
Само число вычисляеться таким образом: нужно взять пару смежных вершин и для этой пары посчитать количество смежных этой паре вершин и связей (причём направлене дуги не учитываеться). И если межу вершинами есть две связи (туда и обратно), то соответственно нужно считать их обе.
На входе есть просто матрица смежности графа.
Думаю, что нужно организовать структуру данных, в которой можно будет хранить одну и вторую вершину, и количества смежных ей связей и вершин.
Может будут у кого советы или идеи?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2017, 20:09
Ответы с готовыми решениями:

По заданной матрице смежности простого графа построить каркас этого графа с использованием поиска в ширину
Задание: заданно матрицу смежности простого графа. Построить каркас этого графа с использованием поиска вширь. Помогите написать...

Создание графа по матрице смежности
Колупаюсь с программкой. Сообразил матрицу смежности. Теперь по матрице смежности хочу построить граф. Перерыл кучу информации, везде...

Построение графа по матрице смежности
Доброго времени суток, форумчане. У меня такая проблема. Нужно на сделать так, чтоб по матрице смежности в графическом интерфейсе по...

3
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
10.11.2017, 04:10
Лучший ответ Сообщение было отмечено st4s как решение

Решение

Цитата Сообщение от st4s Посмотреть сообщение
Думаю, что нужно организовать структуру данных, в которой можно будет хранить одну и вторую вершину, и количества смежных ей связей и вершин.
Ну если душа горит или задача более широкая - то вперед. Устойчивость можно выписать за один просмотр матрицы смежности по алгоритму Магу, вот пример через запрос:
Кликните здесь для просмотра всего текста
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
class Program
{
    static void Main()
    {
        var n = 5;
        var adj = new int[,]
        {
            { 0, 1, 0, 1, 0 },
            { 0, 0, 0, 0, 1 },
            { 0, 0, 0, 1, 0 },
            { 0, 0, 0, 0, 0 },
            { 0, 0, 0, 0, 0 }
        };
 
        var all = new SetOfVertices(Enumerable.Range(0, n));
        var result = adj.Cast<int>()
            // По матрице смежности выбираем все ребра
            .Select((v, k) => new { ij = new int[] { k / n, k % n }, v })
            .Where(e => e.v != 0)
            // для каждого ребра заполняем множество групп вершин (множество подмножеств всех вершин)
            .Aggregate(
                // начиная с одной пустой группы
                new HashSet<SetOfVertices>() { new SetOfVertices() },
                // раздваивая каждую группу по концам текущего ребра
                (sets, e) => new HashSet<SetOfVertices>(e.ij.SelectMany(k => sets.Select(set => new SetOfVertices(set, k))))
            )
            // Выбираем для каждой группы вершин его дополнение
            .Select(g => all.Except(g))
            // Для печати на экран: номера вершин заменяем на латинские буквы и сортируем
            .Select(g => string.Concat(g.Select(v => (char)('A' + v))))
            .OrderBy(g => g.Length)
            .ThenBy(g => g)
            .ToList();
 
        Console.WriteLine("Внутренне устойчивые подмножества: ");
        result.ForEach(Console.WriteLine);
        Console.WriteLine("Число внутренней устойчивости: ");
        Console.WriteLine(result.Max(e => e.Length));
        Console.ReadLine();
    }
}
 
// Этот класс нужен, чтобы не писать IEqualityComparer для HashSet (см. выше)
// можно отказаться от HashSet и использовать List'ы с Distinct (тогда этот класс можно удалить)
class SetOfVertices : SortedSet<int>
{
    public SetOfVertices() { }
    public SetOfVertices(IEnumerable<int> Vertices) : base(Vertices) { }
    public SetOfVertices(IEnumerable<int> Vertices, int Another) : base(Vertices) { Add(Another); }
 
    public override bool Equals(object obj)
        => (obj as SetOfVertices)?.SetEquals(this) ?? base.Equals(obj);
 
    public override int GetHashCode()
        => this.Aggregate(0, (a, x) => a ^ x.GetHashCode());
}


Добавлено через 1 час 8 минут
Цитата Сообщение от st4s Посмотреть сообщение
Также я выяснил, что этот алгоритм работает только для тех графов, у которых нет петель
он работает и с петлями, но вершина, имеющая петлю, не может принадлежать внутренне устойчивому подмножеству (т.е. не влияет на результат), поэтому в книгах расматривают графы без петель. Если у тебя в матрице смежности появляются петли, которых там быть не должно - пропускай ячейки главной диагонали. 19 строка:
C#
1
.Where(e => e.v != 0 && e.ij[0] != e.ij[1])
1
0 / 0 / 0
Регистрация: 20.10.2017
Сообщений: 18
10.11.2017, 04:47  [ТС]
Aael, Спасибо большое Вам Думаю, мне теперь стоит поизучать запросы углублённо дабы лучше всё понимать.
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
10.11.2017, 08:26
st4s, если захочешь разобраться.
Кликните здесь для просмотра всего текста
Алгоритм:
1. берем VV множество подмножеств вершин, с одним пустым элементом.
2. для каждого ребра из i в j:
2.1. раздваиваем VV его (добавляем копию).
2.2. в левую половину VV ко всем множествам приписываем вершину i
2.2. в правую половину VV ко всем множествам приписываем вершину j
3. заменяем каждое подмножество из VV на его дополнение.

Пример. Граф из 3х вершин: A,B,C; и 3х ребер: A->B, B->C, C->B. Просматриваем ребра:
-------------: {{∅}} -множество VV состоит из одного пустого подмножества {A,B,C}:
ребро A->B: {{∅,A}, {∅,B}}
ребро B->C: {{A,B}, {B,B}, {A,C}, {B,C}}
ребро C->B: {{A,B,C}, {B,B,C}, {A,C,C}, {B,C,C}, {A,B,B}, {B,B,B}, {A,C,B}, {B,C,B}}
но, т.к. мы имеем дело с можествами, то во-первых одинаковые вершины внутри элементов будут учитываться по одному разу:
ребро A->B: {{∅,A}, {∅,B}}
ребро B->C: {{A,B}, {B}, {A,C}, {B,C}}
ребро C->B: {{A,B,C}, {B,C}, {A,C}, {B,C}, {A,B}, {B}, {A,C,B}, {B,C}}
во-вторых одинаковые подмножества тоже не будут дублированы:
ребро A->B: {{∅,A}, {∅,B}}
ребро B->C: {{A,B}, {B}, {A,C}, {B,C}}
ребро C->B: {{A,B,C}, {B,C}, {A,C}, {A,B}, {B}}
Строим дополнения: {{∅}, {A}, {B}, {C}, {A,C}}. Т.к. {A,C} - самое большое несобственное подмножество, то его мощность и есть ответ.

Тоже получится если раскрыть скобки в выражении:
(A+B)(B+C)(C+B) = (AB+BB+AC+BC)(C+B) = ABC+BBC+ACC+BCC+ABB+BBB+ACB+BCB
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2017, 08:26
Помогаю со студенческими работами здесь

Создание графа по матрице смежности
Всем привет,подскажите пожалуйста, как создать граф по матрице смежности,которая будет заполняться случайными значениями? (Нужно что бы при...

Построение графа по матрице смежности на C#
Здравствуйте. Недавно начал осваивать язык C# и решил написать прогу по графам. Столкнулся с проблемой в графике. Суть такая, дана...

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

Визуализация графа по матрице смежности
В общем человек заполняет матрицу смежности из textbox. Потом нажимает кнопочку и программа заполняет массив а также переходит на другую...

Визуализация графа по матрице смежности
Доброго всем времени суток. Задача такая: по матрице смежности построить граф в WindowsForms. У графа фиксированные четыре вершины....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru