Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140

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

20.09.2023, 22:46. Показов 4843. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ломаю голову и не пойму как написать программу вот такого условия: Есть министерство из N чиновников, где N натуральное число. У каждого из чиновников могут быть как подчиненные, так и начальники, причем справедливы правила: подчиненные моего подчиненного мои подчиненные, начальники моего начальника - мои начальники, мой начальник не есть мой подчиненный, у каждого чиновника не более одного непосредственного начальника.
Для того чтобы получить лицензию на вывоз меди необходимо получить подпись 1-ого чиновника - начальника всех чиновников. Проблема осложняется тем, что каждый чиновник, вообще говоря, может потребовать "визы", т.е. подписи некоторых своих непосредственных подчиненных и взятку - известное количество долларов. Для каждого чиновника известен непустой список возможных наборов "виз" и соответствующая каждому набору взятка. Пустой набор означает, что данный чиновник не требует виз в данном случае. Чиновник ставит свою подпись лишь после того, как ему представлены все подписи одного из наборов "виз" и уплачена соответствующая взятка.
Необходимо определить и вывести минимальный по сумме уплаченных взяток допустимый порядок получения подписей для лицензии и стоимость.

Может кто-нибудь сможет подсказать, может у кого есть идея.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.09.2023, 22:46
Ответы с готовыми решениями:

Необходимо определить и вывести минимальный по сумме уплаченных взяток допустимый порядок получения подписей для лицензии и стоимость.
Добрый день. Задали такое задание: Есть министерство из N чиновников, где N натуральное число. У каждого из чиновников могут быть как...

Определить порядок получения подписей минимизирующий сумму уплаченных взяток
Добрый день! Задали такую лабу: Ребят, если не сложно кому, помогите с лабораторной: Есть министерство из N чиновников, где N...

Определить сколько слагаемых будет в сумме, когда слагаемое в сумме 1+1/2+1/3+1/4+..станет меньше данного числа
2. Определить сколько слагаемых будет в сумме, когда слагаемое в сумме 1+1/2+1/3+1/4+..станет меньше введенного вами малого числа.

73
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2023, 14:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
В файлах ошибок нет
Да, конечно нет. Я тут выдумываю.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Что делать :
Создать шаблоны стека и очереди, добавить методы доступа к элементам.
Для стека top(), для очереди front() и back()
Написать их с учетом правила Трех.
До этого, нет смысла о чём либо говорит.

Добавлено через 8 минут
C++
1
 std::stack<std::queue<int>> sq;
Ну ладно, можно без шаблонов.
У нас одна очередь и один стек.
Но остальные требования нужно выполнить.
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
27.09.2023, 15:40  [ТС]
SmallEvil, мне сказали, что вместо графа(дерева) надо было использовать очередь, а как сказали есть в файле есть.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2023, 16:02
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
мне сказали, что вместо графа(дерева) надо было использовать очередь, а как сказали есть в файле есть.
Пускай подадут на меня в суд

Ну а если серьезно, я себе это не представляю.

Добавлено через 1 минуту
Они наверное задачи попутали.
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
27.09.2023, 16:07  [ТС]
Я тоже сказала, что как очередь, на что мне сказал преп:" ладно давай с графом(деревом), но надо расписывать вручную стек, а не автоматом, как в программе"
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2023, 16:17
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
" ладно давай с графом(деревом), но надо расписывать вручную стек, а не автоматом, как в программе"
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
но надо расписывать вручную стек, а не автоматом, как в программе
Это значит использовать свои стек и очередь ?
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
27.09.2023, 16:22  [ТС]
Сказали, что стек и очередь использовать желательно как в файле.

А результаты работы программы, согласно условию (по вводу данных и выводу на печать) все ОК.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2023, 17:12
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
Сказали, что стек и очередь использовать желательно как в файле.
Я этого не слышал
Сейчас попробую.

Добавлено через 1 минуту
За основу беру ваши стек и очередь из поста Определить минимальный по сумме уплаченных взяток допустимый порядок получения подписей

Добавлено через 26 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
За основу беру ваши стек и очередь из поста
Они совсем ни на что не годятся ...

Добавлено через 17 минут
Я конечно еще посмотрю, нет ли там багов.
Меня начинает уже на смех пробивать эта задача
Изменения исходного кода притерпела только эта часть :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
            // стек PN всех чиновников поставивших подписи,
            // начиная с самых нижних уровней
            Stack sq;
            Queue subclerks;
            // добавили главного чиновника
            subclerks.push(root->clerk->pn);
            do{
                sq.push({}); // добавили пустую очередь
                Queue next_subclerks;
                while(!subclerks.empty()){
                    auto clerk_pn = subclerks.front();
                    subclerks.pop();
                    sq.top().push(clerk_pn);
                    if (mem[clerk_pn].vplisti != -1){
                        auto& clerk_vlist = (clerks[clerk_pn].vplist[mem[clerk_pn].vplisti]).vlist;
                        int end = clerk_vlist.size();
                        for(int k = 0; k != end; ++k)
                            next_subclerks.push(clerk_vlist[k]->clerk->pn);
                    }
                }
                subclerks = std::move(next_subclerks);
            }while(!subclerks.empty());
полный код
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
#include <utility>
 
struct QueueNode {
    int elem;
    QueueNode* next;
 
    QueueNode(int n) // конструктор
    {
        this->elem = n;
        this->next = nullptr;
    }
};
 
struct Queue{
   using Node = QueueNode;
   Node* tail, * head;
   Queue(const Queue& other):Queue(){
       Node* h = other.head;
       while(h)
          push(h->elem);
    };
   Queue& operator=(const Queue& other){
      clear();
      Node* h = other.head;
       while(h)
          push(h->elem);
      return *this;
   };
   Queue( Queue&& other):Queue(){
      std::swap(tail, other.tail);
      std::swap(head, other.head); 
   }
   Queue& operator=(Queue&& other){
      std::swap(tail, other.tail);
      std::swap(head, other.head);
      return *this;
   }
    Queue()
    {
        tail = nullptr;
        head = nullptr;
    }
   int& front(){
      return head->elem;
   }
    ~Queue() // деструктор
    {
        clear();
    }
    void push(int elem) //добавление элемента
    {
        Node* temp = new Node(elem);
        if (empty()){
            head = tail = temp;
        }
        else {
            tail->next = temp;
            tail = temp;
        }
    }
 
    void pop() //удаление элеиента
    {
        Node* temp = head;
        temp = temp->next;
        delete head;
        head = temp;
    }
 
    void clear() //очистка
    {
        Node* p = head;
        Node* p2;
        while (p != nullptr)
        {
            p2 = p;
            p = p->next;
            delete p2;
        }
        head = tail = nullptr;
    }
 
    bool empty(){
        return head == nullptr;
    }
};
 
struct StackNode {
    using Elem = Queue;
    Elem elem;
    StackNode* next;
 
    StackNode(Elem e = Elem()) // конструктор
    {
        this->elem = std::move(e);
        this->next = nullptr;
    }
};
 
struct Stack {
    using Node = StackNode;
    using Elem = StackNode::Elem;
    Node* head;
    Stack(){
        head = nullptr;
    }
   Stack(const Stack& other) = delete;
   Stack& operator=(const Stack& other) = delete;
   Stack( Stack&& other) = delete;
   Stack& operator=(Stack&& other) = delete;
    ~Stack() // деструктор
    {
        clear();
    }
    Elem& top(){
       return head->elem;
    }
    void push(Elem elem) //добавление элемента
    {
        Node* temp = new Node(std::move(elem));
        temp->next = head;
        head = temp;
    }
 
    void pop() //удаление элеиента
    {
      Node* temp;
      temp = head;
      head = head->next;
      delete temp;
    }
 
    void clear() //очистка
    {
        Node* p = head;
        Node* p2;
        while (p != nullptr)
        {
            p2 = p;
            p = p->next;
            delete p2;
        }
        head = nullptr;
    }
   bool empty() const{
      return head == nullptr;
   }
};
 
#include <iostream>
#include <vector>
#include <algorithm>
// предварительное объявление узла дерева, 
// для установления связей 
struct Node; 
using visas_list_t = std::vector<Node*>; // тип : список виз
// набор виз и цена набора
struct VisaPack{
    visas_list_t vlist;
    int price;
}; 
 
using visas_pack_list_t = std::vector<VisaPack>; // тип : список наборов виз
using clerks_t = std::vector<Node*>; // тип : список чиновников
struct Clerk{
    int pn; // PN чиновника, нужен для мемоизации
    visas_pack_list_t vplist; // список наборов виз
};
struct Node{
    Clerk *clerk{};    // указатель на чиновника
    clerks_t subclerks{}; // список подчиненных
};
 
// стурктура дл¤ сохранения наименьшей суммы и 
// соответствующего набора виз
struct Memo{
    int sum{-1}; // -1 - не требует взятки
    int vplisti{-1}; // индекс набора виз, -1 - нет список наборов виз пуст
};
 
// как бы дерево ;)
class PseudoTree{
public  :
    // clerk - начальник всех начальников, n - количество чиновников
    PseudoTree(Node* clerk, const std::vector<Clerk>& clerks, int n)
        : root{clerk}, clerks{clerks}, mem(n){
    }
    void print(){
        if (root)
            print(root);
    }
    int FindMinSumAndPrint(){
        if(root){
            int min_sum = get_min_contract(root);
 
            // стек PN всех чиновников поставивших подписи,
            // начиная с самых нижних уровней
            Stack sq;
            Queue subclerks;
            // добавили главного чиновника
            subclerks.push(root->clerk->pn);
            do{
                sq.push({}); // добавили пустую очередь
                Queue next_subclerks;
                while(!subclerks.empty()){
                    auto clerk_pn = subclerks.front();
                    subclerks.pop();
                    sq.top().push(clerk_pn);
                    if (mem[clerk_pn].vplisti != -1){
                        auto& clerk_vlist = (clerks[clerk_pn].vplist[mem[clerk_pn].vplisti]).vlist;
                        int end = clerk_vlist.size();
                        for(int k = 0; k != end; ++k)
                            next_subclerks.push(clerk_vlist[k]->clerk->pn);
                    }
                }
                subclerks = std::move(next_subclerks);
            }while(!subclerks.empty());
 
            // print clerks 
            while(!sq.empty()){
                auto& q = sq.top();
                while(!q.empty()){
                    std::cout << q.front() << ' ';
                    q.pop();
                }
                std::cout << std::endl;
                sq.pop();
            }
            return min_sum;
        }
        return -1;
    }
private :   
    Node* root; // корень дерева
    // массив промежуточных результатов для каждого 
    // обработанного чиновника
    std::vector<Memo> mem;
    const std::vector<Clerk>& clerks;
    
    void print(const Node* h, int level=0) {
        for (int i = 0; i < level; i++)
            std::cout << "    ";
        std::cout << h->clerk->pn << std::endl;
        for (int i = 0; i < h->subclerks.size(); i++)
            print(h->subclerks[i], level + 1);
    }
    
    int get_min_contract(Node* h){
        if (mem[h->clerk->pn].sum == -1){
            std::vector<int> prices;
            for(auto& contract : h->clerk->vplist){
                int total_price = contract.price;
                for(auto& clerk : contract.vlist)
                    total_price += get_min_contract(clerk);
                prices.push_back(total_price);
            }
            auto min_price_it = std::min_element(prices.begin(), prices.end());
            mem[h->clerk->pn].sum = (min_price_it == prices.end() ? 0 : *min_price_it);
            mem[h->clerk->pn].vplisti = (min_price_it == prices.end() ? -1 : (min_price_it - prices.begin()));
        }
        return mem[h->clerk->pn].sum;
    }
};
 
int main(){
    using std::cin;
    int n;
    cin >> n;
    std::vector<Clerk> clerks(n);
    std::vector<Node> nodes(n);
 
    for(int in = 0; in!= n; ++in){
        int pn, k, v;
        cin >> pn >> k >> v;
        clerks[pn].pn = pn;
        clerks[pn].vplist.resize(v);
        nodes[pn].clerk = &clerks[pn];
        nodes[pn].subclerks.resize(k);
        for(int ik = 0; ik!= k; ++ik){
            int kpn;
            cin >> kpn;
            nodes[pn].subclerks[ik] = &nodes[kpn];
        }
 
        for(int iv = 0; iv!= v; ++iv){
            int vn;
            cin >> vn;
            clerks[pn].vplist[iv].vlist.resize(vn);
            for(int ivn = 0; ivn != vn; ++ivn){
                int ivpn;
                cin >> ivpn;
                clerks[pn].vplist[iv].vlist[ivn] = &nodes[ivpn];
            }
            cin >> clerks[pn].vplist[iv].price;
        }
    }
    PseudoTree tree(&nodes[0], clerks, n);
    tree.print();
    int min_sum = tree.FindMinSumAndPrint();
    std::cout << "Total amount to pay : " << min_sum << std::endl;
}
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
27.09.2023, 20:52  [ТС]
А по Вашему как расписывать стек, если мне дали не так, как Вы считаете. Просто помимо решить и сдать задачу я очень хочу разобраться.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2023, 21:39
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
решить и сдать задачу
Это одно дел.
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
хочу разобраться
А это совсем другое. И я не могу связать это с первым. Особенно в свете того что ставят палки в колеса.

Цитата Сообщение от elenaiv0101 Посмотреть сообщение
А по Вашему как расписывать стек
Сделать его шаблонным, полностью удалить из него вывод в стандартный поток. И все прочие операции которые не свойственны самому стеку как структуре данных. Отдать ему задачи лишь хранить элементы и получать доступ к ним по определенным правилам. Создать его максимально обособленным и завершенным.
Позаботиться о правиле Пяти.
Позаботиться о хранении данных элемента так, что бы минимизировать копирование.
То что сейчас есть, это ужас. И так как это задача "сдали и забыли" то и делать его не хочется.
При том что непонятно что использовать можно. (такое ощущение что ничего нельзя)
Конструктор перемещения и оператор присваивания перемещением, можно на данном этапе убрать. И std::move тогда тоже.
C++
1
2
3
4
5
6
7
8
9
   Queue( Queue&& other):Queue(){
      std::swap(tail, other.tail);
      std::swap(head, other.head); 
   }
   Queue& operator=(Queue&& other){
      std::swap(tail, other.tail);
      std::swap(head, other.head);
      return *this;
   }
Но это означает что будет происходить множество копирования elem стека/очереди.

Добавлено через 5 минут
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
А по Вашему как расписывать стек, если мне дали не так, как Вы считаете.
Вам дали самый минимальный пример. Для пощупать и посмотреть в лабораторных условиях.
В реальном коде он не жизнеспособен.
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
27.09.2023, 22:19  [ТС]
Буду разбираться, если что будет непонятно, можно спросить?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
27.09.2023, 23:44
Цитата Сообщение от elenaiv0101 Посмотреть сообщение
если что будет непонятно, можно спросить?
Относящиеся к данному заданию, задавайте тут.
Остальные :
Правила форума CyberForum.ru
4. Порядок создания тем.
1. Прежде чем задать вопрос, воспользуйтесь поиском - возможно, ответ на него уже был дан ранее.
2. Если собираетесь создать новую тему, определитесь с разделом или существующей темой, в которой ведется обсуждение этого вопроса.
3. Создавайте темы с осмысленными и понятными названиями - это серьезно повышает шансы, что на ваш вопрос ответят.
4. На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
...
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
01.10.2023, 23:04  [ТС]
Реализовала программу по другому, но как добавить: определить и вывести минимальный по сумме уплаченных взяток допустимый порядок получения подписей для лицензии. Стоимость вывела и посчитала, а как определить и вывести минимальный по сумме уплаченных взяток допустимый порядок получения подписей для лицензии не знаю, не получается. Может кто подскажет как это сделать.

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
#include <iostream>
#include <vector>
 
using namespace std;
 
// предварительное объявление узла графа, для установления связей 
struct Node;
using visas_spisok_t = vector<Node*>; // тип : список виз
// набор виз и цена набора
struct VisaPack
{
    visas_spisok_t vspisok;
    int cena; // цена
};
 
using visas_pack_spisok_t = vector<VisaPack>; // тип : список наборов виз
using chinovniki_t = vector<Node*>; // тип : список чиновников
struct Chinovnik
{
    int pn; // PN - индекс чиновника, нужен для к запоминанию n значений
    visas_pack_spisok_t vpspisok; // список наборов виз
};
struct Node
{
    Chinovnik* chinovnik{};    // указатель на чиновника
    chinovniki_t pod_chinovniki{}; // список подчиненных
};
 
// стурктура для сохранения наименьшей суммы и соответствующего набора виз
struct Memo
{
    int sum{ -1 }; // -1 - не требует взятки
    int vpspiski{ -1 }; // индекс набора виз, -1 - нет список наборов виз пуст
};
 
// Реализация структуры для стека
template <typename T>
class MyStack {
public:
    void push(const T& value) {
        data.push_back(value);
    }
 
    void pop() {
        if (!data.empty()) {
            data.pop_back();
        }
    }
 
    const T& top() const {
        return data.back();
    }
 
    bool empty() const {
        return data.empty();
    }
 
private:
    vector<T> data;
};
 
// Реализация структуры для очереди
template <typename T>
class MyQueue {
public:
    void push(const T& value) const {
        data.push_back(value);
        ++size;
    }
 
    void pop() const {
        if (!data.empty()) {
            data.erase(data.begin());
            --size;
        }
    }
 
    const T& front() const {
        return data.front();
    }
 
    bool empty() const {
        return data.empty();
    }
 
    int getSize() const {
        return size;
    }
 
private:
    mutable vector<T> data;
    mutable int size = 0;
};
 
// граф
class Graf
{
public:
    // chinovnik - начальник всех начальников, n - количество чиновников
    Graf(Node* chinovnik, const vector<Chinovnik>& chinovniki, int n) : head{ chinovnik }, chinovniki{ chinovniki }, mem(n) {  }
    void print()
    {
        if (head)
            print(head);
    }
    int Min_Sum_and_Print()
    {
        if (head)
        {
            int min_sum = poluchit_min_contract(head);
 
            // стек PN всех чиновников поставивших подписи, начиная с самых нижних уровней
            MyStack<MyQueue<int>> sq;
            MyQueue<int> pod_chinovniki;
            // добавили главного чиновника
            pod_chinovniki.push(head->chinovnik->pn);
            do
            {
                sq.push(MyQueue<int>()); // добавили пустую очередь
                int n = pod_chinovniki.getSize();
                for (int i = 0; i != n; ++i)
                {
                    auto chinovnik_pn = pod_chinovniki.front();
                    pod_chinovniki.pop();
                    sq.top().push(chinovnik_pn);
                    if (mem[chinovnik_pn].vpspiski != -1)
                    {
                        auto& chinovnik_vspisok = (chinovniki[chinovnik_pn].vpspisok[mem[chinovnik_pn].vpspiski]).vspisok;
                        int end = chinovnik_vspisok.size();
                        for (int k = 0; k != end; ++k)
                            pod_chinovniki.push(chinovnik_vspisok[k]->chinovnik->pn);
                    }
                }
            } while (!pod_chinovniki.empty());
 
            // печать чиновников подписей
            cout << "порядок получения подписей для лицензии, числа - ID чиновников " << endl;
            while (!sq.empty())
            {
                auto& q = sq.top();
                while (!q.empty())
                {
                    cout << q.front() << ' ';
                    q.pop();
                }
                cout << endl;
                sq.pop();
            }
            return min_sum;
        }
        return -1; // останавливает выполнение программы, если неверно, то будет -1
    }
private:
    Node* head; // корень графа
    // массив промежуточных результатов для каждого обработанного чиновника
    vector<Memo> mem;
    const vector<Chinovnik>& chinovniki;
 
    void print(const Node* h, int level = 0)
    {
        for (int i = 0; i < level; i++)
            cout << "    ";
        cout << " ID чиновника " << h->chinovnik->pn << endl;
        for (int i = 0; i < h->pod_chinovniki.size(); i++)
            print(h->pod_chinovniki[i], level + 1);
    }
 
    int poluchit_min_contract(Node* h)
    {
        if (mem[h->chinovnik->pn].sum == -1)
        {
            vector<int> cena_s;
            for (auto& contract : h->chinovnik->vpspisok)
            {
                int total_cena = contract.cena;
                for (auto& chinovnik : contract.vspisok)
                    total_cena += poluchit_min_contract(chinovnik);
                cena_s.push_back(total_cena);
            }
            auto min_cena_it = min_element(cena_s.begin(), cena_s.end());
            mem[h->chinovnik->pn].sum = (min_cena_it == cena_s.end() ? 0 : *min_cena_it);
            mem[h->chinovnik->pn].vpspiski = (min_cena_it == cena_s.end() ? -1 : (min_cena_it - cena_s.begin()));
        }
        return mem[h->chinovnik->pn].sum;
    }
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    int n;
    cout << " Введите количество чиновников ";
    cin >> n;
    vector<Chinovnik> chinovniki(n);
    vector<Node> node_s(n);
 
    for (int in = 0; in != n; ++in)
    {
        int pn, k, v;
        cout << " Введите через пробел: ID (порядковый номер) чиновника, количество подчиненных текущего чиновника, количество наборов виз (для текущего чиновника) ";
        cin >> pn >> k >> v;
        chinovniki[pn].pn = pn;
        chinovniki[pn].vpspisok.resize(v);
        node_s[pn].chinovnik = &chinovniki[pn];
        node_s[pn].pod_chinovniki.resize(k);
        for (int ik = 0; ik != k; ++ik)
        {
            int kpn;
            cout << " Введите ID (порядковый номер) подчиненных ";
            cin >> kpn;
            node_s[pn].pod_chinovniki[ik] = &node_s[kpn];
        }
 
        for (int iv = 0; iv != v; ++iv)
        {
            int vn;
            cout << " Введите количество виз " << iv + 1 << " набора ";
            cin >> vn;
            chinovniki[pn].vpspisok[iv].vspisok.resize(vn);
            for (int ivn = 0; ivn != vn; ++ivn)
            {
                int ivpn;
                cout << " Введите визы, ID подчиненных подписи которых необходимы ";
                cin >> ivpn;
                chinovniki[pn].vpspisok[iv].vspisok[ivn] = &node_s[ivpn];
            }
            cout << " Введите цену " << iv + 1 << " набора виз ";
            cin >> chinovniki[pn].vpspisok[iv].cena;
        }
    }
    Graf graf(&node_s[0], chinovniki, n);
    graf.print();
    int min_sum = graf.Min_Sum_and_Print();
    cout << " Стоимость: " << min_sum << endl;
}
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
01.10.2023, 23:14
порядок получения подписей для лицензии, числа - ID чиновников
6 7
3 4
0

Стоимость: 5
Ну вот же ваш порядок.
Сначала получаем подписи в чиновников 6 и 7, потом в 3 и 4, и уже в главного 0.

Добавлено через 1 минуту
Стек и очередь на векторе.
То есть так можно, а просто взять использовать готовый стек и очередь нет ?
0
0 / 0 / 0
Регистрация: 03.11.2022
Сообщений: 140
02.10.2023, 00:50  [ТС]
Мне преп сказал так расписать, я расписала, а как в него добавить определить и вывести минимальный по сумме уплаченных взяток допустимый порядок получения подписей для лицензии , расписывая так же, а готовые брать преп запретил.

Добавлено через 1 час 23 минуты
SmallEvil, может сможете подсказать как сделать, как у меня, а не готовый стек и очередь. В готовом я разобралась, поняла, но преп не хочет и слушать так, только как я расписал ему надо. Кто-нибудь подскажите как сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2023, 00:50

Определить максимально допустимый ток по медному электропроводу
Определить максимально допустимый ток по медному электропроводу (d = 2 мм, Rl эл = 5,6*10–3 Ом/м), покрытому резиновой изоляцией , если...

Определить допустимый угол закручивания стального вала
Определить допустимый угол закручивания стального вала, с помощью которого передается мощность 5 кВт при частоте вращения 100 об/мин....

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

В натуральном числе n поменять местами порядок цифр для получения наибольшего числа
Вводится какое-то число n, к примеру, 2473, а программа должна поменять порядок следования цифр таким образом, чтобы получилось...

Минимальный путь для получения максимальной суммы
Суть задачи состоит в том что есть массив допустим 5х5.Нам нужно чтобы программа нашла манимальный путь для того чтобы получить...


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

Или воспользуйтесь поиском по форуму:
74
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru