Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 28.11.2022
Сообщений: 7

Решение с помощью двудольных графов и алгоритма Куна

09.12.2022, 19:05. Показов 2099. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста решить задачу!!!!!
Должна решаться с помощью двудольных графов и алгоритма Куна


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

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

В Жениной семье все очень любят сок, поэтому могут утром выпить не один стакан, причем разных видов сока. Например, его сестра Катя очень любит грейпфрутовый и апельсиновый соки. Женя, как наиболее технически грамотный человек, каждое утро занимается приготовлением соков.

Опишем подробнее, как работает соковыжималка. В нее загружаются фрукты, они проходят отжим в центрифуге, обезвоженная мякоть сбрасывается в отдельный резервуар, а сок попадает в специальную емкость.

Основная проблема состоит в том, что эту емкость иногда приходится мыть. Например, если после приготовления апельсинового сока, необходимо приготовить яблочный, то емкость надо мыть, иначе получится апельсиново-яблочный сок. Более формально, пусть сок A состоит из компонентов a1, ..., an, а сок B – из компонентов b1, ..., bm. Сок B можно готовить после сока A, если любой из компонентов ai является компонентом сока B (т.е. ). В противном случае емкость для сока надо помыть.

Женя не очень любит мыть посуду, поэтому хочет мыть емкость как можно меньшее число раз. Помогите ему.

Входные данные
Первая строка входного файла содержит количество N различных соков, которые требуется приготовить (1 ≤ N ≤ 300). Каждая из последующих N строк описывает один из соков. Описание сока состоит из числа k его компонентов (1 ≤ k ≤ 300) и списка этих компонентов. Каждый из компонентов сока описывается словом длиной до 30 символов из строчных и прописных букв латинского алфавита. Прописные и строчные буквы различаются. Различные компоненты имеют различные названия.

Выходные данные
В выходной файл выведите минимальное количество раз, которое Жене придется помыть емкость для сока. Учитывайте при этом, что емкость для сока надо помыть и после приготовления последней порции сока.



Ввод:
4
1 Apple
2 Apple Orange
1 Orange
2 Orange Pineapple
Выход:
2


Ввод:
3
1 Apple
1 Orange
1 Mango
Выход:
3

На informatics задача №111733
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.12.2022, 19:05
Ответы с готовыми решениями:

Интервальная раскраска двудольных графов
Доброго дня господа. Есть у кого нибудь пример двудольного графа, не допускающей интервальной реберной раскраски?

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

Решение задач с помощью графов
Уважаемые форумчане, помогите решить пять задач на нахождение вероятности с помощью графов. Заранее благодарю. Задача № 1 ...

2
 Аватар для igorrr37
2878 / 2025 / 992
Регистрация: 21.12.2010
Сообщений: 3,779
Записей в блоге: 10
06.08.2023, 19:42
на шестом тесте time limit, а так то работает
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <ranges>
#include <iterator>
#include <numeric>
#include <iomanip>
#include <unordered_set>
namespace rng = std::ranges;
 
std::vector<std::vector<int>> g;    // будем хранить только рёбра из левой доли в правую
std::vector<bool> vUsed;            // вспомогательный массив для поиска пути dfs-ом
std::vector<int> vMatch;            // с какой вершиной сматчена вершина правой доли (-1, если ни с какой)
 
// dfs возвращает, можно ли найти путь из вершины v в какую-нибудь вершину правой доли
// если можно, то ещё и проводит чередование
bool dfs(int v)
{
    if (vUsed[v])
        return false;
    vUsed[v] = true;
    for (size_t i = 0; i < g[v].size(); ++i)
    {
        if (g[v][i] == 1)
        {
            int to = i;
            if (vMatch[to] == -1 || dfs(vMatch[to]))
            {
                vMatch[to] = v;
                return true;
            }
        }
    }
    return false;
}
 
int main()
{
    std::vector<std::unordered_set<std::string>> vj;
    int n{}, k{};
    std::cin >> n;
    g.resize(n);
    rng::for_each(g, [n](auto& v) { v.resize(n); });
    for (int i = 0; i < n; ++i)
    {
        std::cin >> k;
        vj.emplace_back();
        std::copy_n(std::istream_iterator<std::string>{std::cin}, k, std::inserter(vj.back(), vj.back().end()));
    }
    for (int i = 0; i < vj.size(); ++i)
    {
        for (int j = 0; j < vj.size(); ++j)
        {
            if (i != j && rng::all_of(vj[i], [&](auto const& s) {return vj[j].contains(s); }))
            {
                g[i][j] = 1;
            }
        }
    }
 
    vUsed.resize(n, false);
    vMatch.resize(n, -1);
    int maxPairs{};
    for (int i = 0; i < n; ++i)
    {
        std::fill_n(vUsed.begin(), n, false);
        if (dfs(i))
        {
            ++maxPairs;
        }
    }
 
    int cntWash{};
    std::fill_n(vUsed.begin(), n, false);
    for (int i = 0; i < n; ++i)
    {
        if (vUsed[i])
            continue;
        int head = i;
        while (vMatch[head] != -1)
        {
            head = vMatch[head];
        }
 
        while (true)
        {
            vUsed[head] = true;
            auto it = rng::find(vMatch, head);
            if (it == vMatch.end())
                break;
            vUsed[it - vMatch.begin()] = true;
            head = it - vMatch.begin();
        }
        ++cntWash;
    }
    cntWash += rng::count_if(vUsed, [](auto b) {return !b; });
    std::cout << "\ncntWash: " << cntWash << "\n";
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,219
07.08.2023, 08:32
Цитата Сообщение от ShestakobDI Посмотреть сообщение
Основная проблема состоит в том, что эту емкость иногда приходится мыть. Например, если после приготовления апельсинового сока, необходимо приготовить яблочный, то емкость надо мыть, иначе получится апельсиново-яблочный сок. Более формально, пусть сок A состоит из компонентов a1, ..., an, а сок B – из компонентов b1, ..., bm. Сок B можно готовить после сока A, если любой из компонентов ai является компонентом сока B (т.е. ). В противном случае емкость для сока надо помыть.
То есть после апельсинового сока нельзя делать яблочный (надо мыть), а после апельсиново-клубничного можно делать яблочно-клубничный (не надо мыть)? Или все таки под словом "любой", на сам деле имеется в виду "каждый"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2023, 08:32
Помогаю со студенческими работами здесь

Приближенное решение уравнения с помощью алгоритма хорд
Написать программу, в ходе выполнения которой одновременно с отысканием приближенного решения уравнения f(x)=0 с помощью алгоритма хорд...

Решение неоднородной СЛАУ с помощью алгоритма Ланцоша.
Помогите привести пример решения неоднородной СЛАУ с помощью алгоритма Ланцоша.

Решение задач в Паскале с помощью Алгоритма сортировки эл-тов массива по убыванию или по возрастанию
Всем привет)) Помогите решить задачу((( Задать массив А случайным образом выдать 3 самых больших элемента этого массива...

реализация алгоритма кластеризации графов
что за алгоритм (способ) реализации кластеризации графов? int n; vector&lt;int&gt; g; bool used; vector&lt;int&gt; comp; void...

Вычисление НОД с помощью бинарного алгоритма и алгоритма Евклида.
Решил заняться программированием, друг посоветовал язык C# и дал задачу: Сделать алгоритм для вычисления НОД с помощью бинарного...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru