মান লিজিয়ে n সংখ্যক ভিন্ন কোর্স আছে যা ১ থেকে n পর্যন্ত লেবেলড। আরেকটি অ্যারে আছে relations যেখানে relations[i] একটি জোড়া (prevCourse_i, nextCourse_i) ধারণ করে, যা prevCourse_i এবং nextCourse_i কোর্সের মধ্যে প্রি-রেকুইজিট সম্পর্ক বোঝায়: অর্থাৎ prevCourse_i কোর্সটি nextCourse_i কোর্সের আগে নিতে হবে। এবং শেষ প্যারামিটার হল k। এক সেমিস্টারে আমরা সর্বোচ্চ k সংখ্যক কোর্স নিতে পারি যতক্ষণ না আমরা আগের সেমিস্টারে সেই কোর্সগুলোর সকল প্রি-রেকুইজিট নেওয়া থাকে। সকল কোর্স নিতে ন্যূনতম কত সেমিস্টার লাগবে সেটি বের করতে হবে।
যেমন, ইনপুট হলে (চিত্র দেখুন), তবে আউটপুট হবে 3 কারণ প্রথম সেমিস্টারে কোর্স ১ ও ২ নেওয়া যায়, এখন কোর্স ৩, ৪, ৫-এর জন্য যোগ্য হয়ে উঠল। দ্বিতীয় সেমিস্টারে ৫ এবং ৩ বা ৪ যেকোনো একটি নিলে, তৃতীয় সেমিস্টারে বাকি কোর্সগুলো শেষ করা যায়। মোট ৩ সেমিস্টার লাগবে।
সমাধানের ধাপসমূহ
taken := নতুন সেটg1 := n` সাইজের খালি লিস্টের লিস্টg2 := n` সাইজের লিস্ট ০ দিয়ে ফিল করাw := n` সাইজের লিস্ট ০ দিয়ে ফিল করাsemester := 0relations-এ প্রতিটিxএর জন্য:g1[x[1]-1].append(x[0]-1)g2[x[0]-1].append(x[1]-1)
weight := g1-এর সব আইটেমের দৈর্ঘ্য থেকে তৈরি লিস্টi = 0থেকেn-1পর্যন্ত:g1[i]-এ প্রতিটিxএর জন্য:w[x] = max(w[x], weight[i])
len(taken) < nথাকা পর্যন্ত:courses := নতুন লিস্টi = 0থেকেn-1পর্যন্ত:যদি
g1[i]খালি হয় এবংi not in taken, তবেcourses.append([i, w[i]])
যদি
len(courses) > kহয়, তবে:coursesকে দ্বিতীয় প্যারামিটার অনুযায়ী রিভার্স সর্ট করুনcourses := courses[:k]
semester := semester + 1courses-এ প্রতিটিxএর জন্য:g2[x[0]]-এ প্রতিটিyএর জন্য:g1[y].remove(x[0])g2[x[0]] := []taken.add(x[0])
semesterরিটার্ন করুন।
উদাহরণ
নিচের ইমপ্লিমেন্টেশনটি দেখুন:
def solve(n, relations, k):
taken = set()
g1 = [[] for _ in range(n)]
g2 = [[] for _ in range(n)]
w = [0] * n
semester = 0
for x in relations:
g1[x[1]-1].append(x[0]-1)
g2[x[0]-1].append(x[1]-1)
weight = list(map(len, g1))
for i in range(n):
for x in g1[i]:
w[x] = max(w[x], weight[i])
while len(taken) < n:
courses = []
for i in range(n):
if (not g1[i]) and (i not in taken):
courses.append([i, w[i]])
if len(courses) > k:
courses = sorted(courses, key=lambda x: x[1], reverse=True)
courses = courses[:k]
semester += 1
for x in courses:
for y in g2[x[0]]:
g1[y].remove(x[0])
g2[x[0]] = []
taken.add(x[0])
return semester
n = 6
relations = [(1,3),(2,5),(2,4),(5,6)]
k = 2
print(solve(n, relations, k))ইনপুট
6, [(1,3),(2,5),(2,4),(5,6)], 2
আউটপুট
3