У меня есть проект, он требует, чтобы я раздавал курсы студентам. Все студенты просят некоторые курсы, но им разрешено только получить определенное количество из них (это может быть то, что они требуют, меньше, чем это или просто 0), все курсы имеют квоты, и мне нужно выяснить, существует ли идеальное совпадение (все квоты заполнены, и студенты получили то, что им разрешено) или нет, если существует результат этого сопоставления.
Я просто получил вход и сохранил его в объектах до сих пор. В проекте есть ограничение по времени, что я не знаю, с чего начать. Есть предложения или метод для этого проекта?
Я думаю, что я должен реализовать алгоритм двойного сопоставления. Я новичок в C ++, так что мне нужно реализовать класс узла и класс ребра? Или я должен использовать список смежности? Какой из них работает быстрее?
Например, студент запрашивает уроки с номерами 3,4 и 5, но ему разрешено брать 2 урока, поэтому алгоритм должен дать 2 из этих вариантов, если есть возможность идеального соответствия.
То, что я представлял себе проблему двудольного, было этим, но я думаю, что это трудно осуществить.
http://i.stack.imgur.com/wtJ6o.jpg
1.student wants 3 ,4 system allows him to take 2 lessons
2.student wants 1,2,3,4 system allows him to take 3 lessons
3.student wants 1,2,3,4 system allows him to take 2 lessons
4.student wants 1,3,5 system allows him to take 2 lessons
5.student wants 2,5 system allows him to take 1 lessons
1.lesson's quota = 2
2.lesson's quota = 1
3.lesson's quota = 2
4.lesson's quota = 3
5.lesson's quota = 2
I just wrote this ,this might not be the best example.
One possible solution is = 1 -> (3,4) 2->(1,2,4) 3->(3,4) 4->(1,5) 5->(5)
Another is = 1 -> (3,4) 2->(1,2,4) 3->(1,4) 4->(3,5) 5->(5)
может быть больше, я не знаю.
(студент -> уроки)
Поскольку одному студенту может быть назначено более одного курса, я не думаю, что проблему можно решить с помощью простого алгоритма максимального двудольного сопоставления.
Эта проблема является типом транспортная проблема, где курсы являются sources
и студенты destinations
, Квота каждого курса capacity
, demand
для каждого студента — это количество уроков, которое ему позволяет система.
РЕДАКТИРОВАТЬ:
Вы можете сформулировать проблему транспортировки следующим образом:
Разделите уроки так, чтобы на каждом уроке была цитата 1. Итак, в вашем примере будет 10 уроков. Распределите затраты следующим образом:
Demand: 2 3 2 2 1
St1 St2 St3 St4 St5
Less1.1 5 0 0 0 5
Less1.2 5 1 1 1 5 // cost for second dummy lesson is slightly high to differentiate.
Less2.1 5 0 0 5 0
Less3.1 0 0 0 0 5
Less3.2 1 1 1 1 5
Less4.1 0 0 0 5 5
Less4.2 1 1 1 5 5
Less4.3 2 2 2 5 5
Less5.1 5 5 5 0 0
Less5.2 5 5 5 1 1
Других решений пока нет …