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

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

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

Author24 — интернет-сервис помощи студентам
есть три множества одинаковой мощности-мужчины женщины и дома. (все по n)
между мужчинами и женщинами есть симпатии.
и мужчинам:cofee2: и женщинам нравятся некоторые дома.
сколько обоюдносимпатизирующих пар можно заселить в нравящийся им дом?
т.е. надо вывести кол-во идеальных вариантов..
социально важная задача, кстати!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2010, 12:47
Ответы с готовыми решениями:

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

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

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

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

30
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
30.12.2010, 07:03 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от valeriikozlov Посмотреть сообщение
а я почему-то считаю что с помощью графов (матрицы смежности) намного быстрее и легче узнать обоюдносимпатизирующих женщин и мужчин например.
а легче, ли?
или расчитать и наложить битную маску, или просто взять следующий элемент списка.
взять элемент обычно быстрее.
кроме того, основные потери времени и памяти при большом n будут на сохранение в стек/восстановление из него(ведь расчет должен быть рекурсивным) а не на вычисление симпатий .
для сохранения текущего состояния при использовании матриц, нужно запихнуть в стек всю матрицу. а в случае списков - лишь "список изменений".
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 09:24 22
Цитата Сообщение от Patch Посмотреть сообщение
для сохранения текущего состояния при использовании матриц, нужно запихнуть в стек всю матрицу. а в случае списков - лишь "список изменений
зачем всю матрицу в стек? В ответе №17 я по-моему довольно ясно написал что оптимальней запихивать в стек.
А вот при Вашем алгоритме в стек запихивается что-то очень много всего:
- все женщины, в составе каждой женщины массив всех мужчин;
- все мужчины, в составе каждого мужчины массив всех женщин;
По объему это две матрицы смежности.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2010, 09:59 23
Цитата Сообщение от valeriikozlov Посмотреть сообщение
мощности-мужчины
там надо дефис на двоеточие исправить.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 10:06 24
taras atavin,
Цитата Сообщение от taras atavin Посмотреть сообщение
там надо дефис на двоеточие исправить.
тогда это к автору темы. я только цитировал.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2010, 10:14 25
Кстати, можно и так слепить софтину, что и у домов будут симпатии. Так вот, есть ли в вашей задаче у домов симпатии?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 10:18 26
taras atavin, а можно добавить еще и симпатии женщин к женщинам, мужчин к мужчинам. Получается точно как написал easybudda настоящий Дом-2
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2010, 10:27 27
Нет, я больший бред имел ввиду.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
30.12.2010, 13:02 28
Цитата Сообщение от valeriikozlov Посмотреть сообщение
зачем всю матрицу в стек? В ответе №17 я по-моему довольно ясно написал что оптимальней запихивать в стек.
А вот при Вашем алгоритме в стек запихивается что-то очень много всего:
- все женщины, в составе каждой женщины массив всех мужчин;
- все мужчины, в составе каждого мужчины массив всех женщин;
По объему это две матрицы смежности.
а затем, что иначе нельзя восстановить исходный вариант.
и все промежуточные.
потому, что каждая найденная пара с домом - есть точка ветвления алгоритма.
не "две матрицы смежности", а все, какие есть
вот это "все женщины, в составе каждой женщины массив всех мужчин;" я не понял.
с каких это пор массив мужчины включен в состав женщины? О_о
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
30.12.2010, 14:47 29
Цитата Сообщение от Patch Посмотреть сообщение
вот это "все женщины, в составе каждой женщины массив всех мужчин;" я не понял.
с каких это пор массив мужчины включен в состав женщины?
Или я плохо читать умею:
а)создать структуры:
1)женщина:
массив из n двоичных элементов(отражающий ее симпатии), по одному на каждого мужчину
taras atavin, может Вы это и имели ввиду, но более извращенный вариант: это симпатия между домами.
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
30.12.2010, 15:56 30
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Или я плохо читать умею
вам виднее.
но "массив из двоичных элементов" и "массив мужчин" - не совсем одно и то-же, вам не кажется?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
30.12.2010, 18:05 31
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
30.12.2010, 18:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2010, 18:05
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru