Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для leysanka
0 / 0 / 0
Регистрация: 23.12.2009
Сообщений: 12

Вывести количество идеальных вариантов

28.12.2010, 12:47. Показов 3093. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть три множества одинаковой мощности-мужчины женщины и дома. (все по n)
между мужчинами и женщинами есть симпатии.
и мужчинам:cofee2: и женщинам нравятся некоторые дома.
сколько обоюдносимпатизирующих пар можно заселить в нравящийся им дом?
т.е. надо вывести кол-во идеальных вариантов..
социально важная задача, кстати!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2010, 12:47
Ответы с готовыми решениями:

Найти количество идеальных чисел в заданном диапазоне
Находит количество идеальных чисел в заданном диапазоне. Идеальным называется число, равное сумме всех его делителей, не включая его...

Количество возможных вариантов и ребус
Прошу помощи 1)Перед фермером стоит задача: купить на 100 рублей 100 голов скота. Стоимость быка – 10 руб., коровы – 5 руб. и телёнка...

Выведите количество идеальных свитеров
Программист Борис хочет купить себе свитер. Разумеется, с оленями. После долгого изучения различный вариантов, он понял, что идеальный...

30
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
30.12.2010, 07:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от valeriikozlov Посмотреть сообщение
а я почему-то считаю что с помощью графов (матрицы смежности) намного быстрее и легче узнать обоюдносимпатизирующих женщин и мужчин например.
а легче, ли?
или расчитать и наложить битную маску, или просто взять следующий элемент списка.
взять элемент обычно быстрее.
кроме того, основные потери времени и памяти при большом n будут на сохранение в стек/восстановление из него(ведь расчет должен быть рекурсивным) а не на вычисление симпатий .
для сохранения текущего состояния при использовании матриц, нужно запихнуть в стек всю матрицу. а в случае списков - лишь "список изменений".
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 09:24
Цитата Сообщение от Patch Посмотреть сообщение
для сохранения текущего состояния при использовании матриц, нужно запихнуть в стек всю матрицу. а в случае списков - лишь "список изменений
зачем всю матрицу в стек? В ответе №17 я по-моему довольно ясно написал что оптимальней запихивать в стек.
А вот при Вашем алгоритме в стек запихивается что-то очень много всего:
- все женщины, в составе каждой женщины массив всех мужчин;
- все мужчины, в составе каждого мужчины массив всех женщин;
По объему это две матрицы смежности.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2010, 09:59
Цитата Сообщение от valeriikozlov Посмотреть сообщение
мощности-мужчины
там надо дефис на двоеточие исправить.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 10:06
taras atavin,
Цитата Сообщение от taras atavin Посмотреть сообщение
там надо дефис на двоеточие исправить.
тогда это к автору темы. я только цитировал.
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2010, 10:14
Кстати, можно и так слепить софтину, что и у домов будут симпатии. Так вот, есть ли в вашей задаче у домов симпатии?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 10:18
taras atavin, а можно добавить еще и симпатии женщин к женщинам, мужчин к мужчинам. Получается точно как написал easybudda настоящий Дом-2
0
 Аватар для taras atavin
4226 / 1799 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2010, 10:27
Нет, я больший бред имел ввиду.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
30.12.2010, 13:02
Цитата Сообщение от valeriikozlov Посмотреть сообщение
зачем всю матрицу в стек? В ответе №17 я по-моему довольно ясно написал что оптимальней запихивать в стек.
А вот при Вашем алгоритме в стек запихивается что-то очень много всего:
- все женщины, в составе каждой женщины массив всех мужчин;
- все мужчины, в составе каждого мужчины массив всех женщин;
По объему это две матрицы смежности.
а затем, что иначе нельзя восстановить исходный вариант.
и все промежуточные.
потому, что каждая найденная пара с домом - есть точка ветвления алгоритма.
не "две матрицы смежности", а все, какие есть
вот это "все женщины, в составе каждой женщины массив всех мужчин;" я не понял.
с каких это пор массив мужчины включен в состав женщины? О_о
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 14:47
Цитата Сообщение от Patch Посмотреть сообщение
вот это "все женщины, в составе каждой женщины массив всех мужчин;" я не понял.
с каких это пор массив мужчины включен в состав женщины?
Или я плохо читать умею:
а)создать структуры:
1)женщина:
массив из n двоичных элементов(отражающий ее симпатии), по одному на каждого мужчину
taras atavin, может Вы это и имели ввиду, но более извращенный вариант: это симпатия между домами.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
30.12.2010, 15:56
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Или я плохо читать умею
вам виднее.
но "массив из двоичных элементов" и "массив мужчин" - не совсем одно и то-же, вам не кажется?
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.12.2010, 18:05
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
//////////////////////////////////////////////////////////////////////////////////////
//есть три множества одинаковой мощности-мужчины женщины и дома. (все по n)
//между мужчинами и женщинами есть симпатии.
//и мужчинам и женщинам нравятся некоторые дома.
//сколько обоюдносимпатизирующих пар можно заселить в нравящийся им дом?
//т.е. надо вывести кол-во идеальных вариантов.
//////////////////////////////////////////////////////////////////////////////////////
//Задача решена с помощью алгоритма Куна.
//////////////////////////////////////////////////////////////////////////////////////
#include <deque>
#include <iostream>
#include <map>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::map<int, bool>       T_adj_row;
typedef std::map<int, T_adj_row>  T_adj_matr;
typedef std::deque<bool>          T_use;
typedef std::deque<int>           T_matching;
//////////////////////////////////////////////////////////////////////////////////////
T_adj_matr  input_bipartite_graph(int  couples_total)
{   
    T_adj_matr  adj_matr;
    const int   HOUSE_NUM_MIN  = 1;
    const int   BREAK_NUMBER   = HOUSE_NUM_MIN - 1;
    std::cout << "Для каждой пары мужчина-женщина введите "
              << "номера нравящихся им домов "
              << std::endl
              << "из диапазона "
              << HOUSE_NUM_MIN
              << ".."
              << couples_total
              << " ("
              << BREAK_NUMBER
              << " - конец ввода): "
              << std::endl;    
 
    for(int  couple_ind = 0; couple_ind < couples_total; ++couple_ind)
    {        
        std::cout << std::endl
                  << "Пара "                  
                  << couple_ind + 1
                  << ": "
                  << std::endl;
 
        std::cout << '\t'
                  << "номера нравящихся домов: "
                  << std::endl;
        
        for(;;)
        {
            std::cout << '\t'
                      << "-> ";
 
            int  house_ind = 0;
            std::cin >> house_ind;
            if(house_ind == BREAK_NUMBER)
            {
                break;
            }
            else if(   house_ind < HOUSE_NUM_MIN 
                    || couples_total < house_ind)
            {
                std::cout << '\t'
                          << "допустимы только номера из диапазона "
                          << HOUSE_NUM_MIN
                          << ".."
                          << couples_total
                          << std::endl;                          
            }
            else
            {
                house_ind += couples_total - 1;
                adj_matr[couple_ind][house_ind] = adj_matr[house_ind][couple_ind] = true;
            }
        }        
    }
    return  adj_matr;
}
//////////////////////////////////////////////////////////////////////////////////////
bool  find_matching
    (
        int          couple_ind,
        int          couples_total,
        T_use&       use_couple,
        T_adj_matr&  adj_matr,
        T_matching&  couple_of,
        int          empty_couple_ind
    )
{
    use_couple[couple_ind] = true;
    for(int  house_ind = couples_total; house_ind < couples_total * 2; ++house_ind)
    {
        if(!adj_matr[couple_ind][house_ind])  continue;
 
        if(                
               couple_of[house_ind] == empty_couple_ind 
           ||    !use_couple[couple_of[house_ind]]
              && find_matching
                     (
                         couple_of[house_ind],
                         couples_total,
                         use_couple,
                         adj_matr,
                         couple_of,
                         empty_couple_ind
                     )                  
          )
        {
            couple_of[house_ind] = couple_ind;
            return  true;
        }
    }
    return  false;
}
//////////////////////////////////////////////////////////////////////////////////////
void  print_couples_settling(int  couples_total, T_adj_matr&  adj_matr)
{
    const int   EMPTY_COUPLE_IND = -1;
    T_use       use_couple  (couples_total);                                            
                                            
    T_matching  couple_of   (couples_total * 2, EMPTY_COUPLE_IND);//Размер двойной, так как
                                                                  //номера домов начинаются
                                                                  //с couples_total.
    //Пробегаемся по парам:
    for(int  couple_ind = 0; couple_ind < couples_total; ++couple_ind)
    {
        //Обнуляем использованные вершины.
        use_couple.assign(couples_total, false);
        find_matching
            (
                couple_ind, 
                couples_total, 
                use_couple, 
                adj_matr, 
                couple_of,
                EMPTY_COUPLE_IND
            );
    }
 
    //Печатаем найденное максимальное паросочетание:
    std::cout << std::endl
              << "Максимальное паросочетание:"
              << std::endl;
    for(int  house_ind = couples_total; house_ind < couples_total * 2; ++house_ind)
    {
        if(couple_of[house_ind] != EMPTY_COUPLE_IND)
        {
            std::cout << '\t'
                      << "дом "
                      << house_ind - (couples_total - 1)
                      << " - пара "
                      << couple_of[house_ind] + 1
                      << std::endl;
        }
    }
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите количество пар мужчина-женщина: ";
    int  couples_total = 0;
    std::cin >> couples_total;
 
    T_adj_matr  adj_matr(input_bipartite_graph(couples_total));
    print_couples_settling(couples_total, adj_matr);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.12.2010, 18:05

Вывести количество безопасных вариантов формирования стопки из N контейнеров
При переработке радиоактивных материалов образуются отходы трех видов — особо опасные (тип A), условно неопасные (тип B) и совсем не...

Вывести количество всех возможных вариантов вывода числа в виде "ступеньки"
Надо реализовать разбиение натурального числа, кторое меньше 100. Есть специальное условие : представим, что число это количество...

Количество вариантов
Здравствуйте. Не мог придумать более подходящего названия теме, так как сам не знаю название подобному Итак, у нас есть...

Количество вариантов бус
Дано: 2 красных бусины 1 синяя бусина 2 белых бусины Для того, чтобы сделать бусы, необходимо нанизать бусинки на нить и соеденить...

Найти количество конечных вариантов
Кузнечик может прыгать в одном из двух направлений. Сколько конечных вариантов возможно, если он сделает 8 прыжков. Я предполагаю, что...


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru