ধরুন, আমাদের একটি গ্রাফ দেওয়া হয়েছে যাতে 0 থেকে n -1 পর্যন্ত n শীর্ষবিন্দু রয়েছে। গ্রাফটি অনির্দেশিত এবং প্রতিটি প্রান্তের একটি ওজন রয়েছে। সুতরাং গ্রাফটি দেওয়া হলে, আমাদের এমএসটি গ্রাফে সমালোচনামূলক এবং ছদ্ম-সমালোচনামূলক প্রান্তগুলি খুঁজে বের করতে হবে। একটি প্রান্তকে একটি জটিল প্রান্ত বলা হয় যদি সেই প্রান্তটি মুছে ফেলার ফলে MST ওজন বৃদ্ধি পায়। একটি ছদ্ম-সমালোচনামূলক প্রান্ত হল একটি প্রান্ত যা সমস্ত গ্রাফের MST-তে প্রদর্শিত হতে পারে, কিন্তু সব নয়৷ আমরা ইনপুট হিসাবে গ্রাফ দেওয়া প্রান্তের সূচী খুঁজে বের করি।
সুতরাং, যদি ইনপুট মত হয়
এবং শীর্ষবিন্দুর সংখ্যা হল 5, তাহলে আউটপুট হবে [[], [0, 1, 2, 3, 4]]প্রদত্ত গ্রাফে কোন ক্রিটিকাল এজ নেই এবং সব এজ ছদ্ম-ক্রিটিকাল। যেহেতু সমস্ত প্রান্তের ওজন একই, গ্রাফ থেকে যে কোনো 3টি প্রান্ত একটি MST তৈরি করবে৷
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন সংজ্ঞায়িত করুন find_mst()। এটি num_vertices, graph, init :=null, exl :=null
লাগবে -
একটি সাহায্যকারী ফাংশন পরিদর্শন() সংজ্ঞায়িত করুন। এটি আপনাকে নিয়ে যাবে
-
k[u] :=সত্য
-
প্রতিটি v, w in graph[u, an empty list], do
এর জন্য-
যদি exl এবং u থাকে exl এবং v হয় exl তে, তাহলে
-
পরবর্তী পুনরাবৃত্তির জন্য যান
-
-
যদি না হয় k[v] সত্য, তাহলে
-
ট্রিপলেট (w,u,v) স্তূপ tmp
এ পুশ করুন
-
-
-
res :=0
-
k :=False মান ধারণকারী num_array-এর একটি নতুন তালিকা
-
tmp :=একটি নতুন গাদা
-
যদি init অ-নাল হয়, তাহলে
-
u :=init
-
v :=init
-
w :=init
-
res :=res + w
-
k[u] :=সত্য
-
k[v] :=সত্য
-
ভিজিট(u) বা ভিজিট(v)
-
-
অন্যথায়,
-
ভিজিট করুন(0)
-
-
টিএমপি খালি না থাকার সময়, করুন
-
w :=হিপ টিএমপি
থেকে সবচেয়ে ছোট আইটেম পপ করুন -
u :=হিপ টিএমপি
থেকে সবচেয়ে ছোট আইটেম পপ করুন -
v :=হিপ টিএমপি
থেকে সবচেয়ে ছোট আইটেম পপ করুন -
যদি k[u] এবং k[v] অ-শূন্য হয়, তাহলে
-
পরবর্তী পুনরাবৃত্তির জন্য যান
-
-
res :=res + w
-
যদি না হয় k[u] সত্য, তাহলে
-
ভিজিট করুন(u)
-
-
যদি না হয় k[v] সত্য, তাহলে
-
ভিজিট করুন(v)
-
-
-
k এর সবগুলো সত্য হলে res ফেরত দিন, অন্যথায় ইনফিনিটি ফেরত দিন
-
প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন:
-
গ্রাফ :=প্রদত্ত গ্রাফ
-
temp :=find_mst(num_vertices, গ্রাফ)
-
c_edge :=একটি নতুন তালিকা
-
p_edge :=একটি নতুন তালিকা
-
আমি 0 থেকে প্রান্তের মাপ পরিসীমার জন্য, করুন
-
যদি find_mst(num_vertices, graph, exl =edges[i, index 2 to end])> temp, তারপর
-
c_edge
এর শেষে i ঢোকান
-
-
অন্যথায়, যদি find_mst(num_vertices, graph, init =edges[i]) temp এর মত হয়, তাহলে
-
p_edge
এর শেষে i ঢোকান
-
-
-
[c_edge, p_edge]
ফেরত দিন
উদাহরণ
আসুন আরও ভালভাবে বোঝার জন্য নিম্নলিখিত বাস্তবায়ন দেখি
from heapq import heappop, heappush def solve(num_vertices, edges): graph = dict() for u, v, w in edges: graph.setdefault(u, []).append((v, w)) graph.setdefault(v, []).append((u, w)) temp = find_mst(num_vertices, graph) c_edge, p_edge = [], [] for i in range(len(edges)): if find_mst(num_vertices, graph, exl = edges[i][:2]) > temp: c_edge.append(i) elif find_mst(num_vertices, graph, init = edges[i]) == temp: p_edge.append(i) return [c_edge, p_edge] def find_mst(num_vertices, graph, init = None, exl = None): def visit(u): k[u] = True for v, w in graph.get(u, []): if exl and u in exl and v in exl: continue if not k[v]: heappush(tmp, (w, u, v)) res = 0 k = [False] * num_vertices tmp = [] if init: u, v, w = init res += w k[u] = k[v] = True visit(u) or visit(v) else: visit(0) while tmp: w, u, v = heappop(tmp) if k[u] and k[v]: continue res += w if not k[u]: visit(u) if not k[v]: visit(v) return res if all(k) else inf print(solve(5, [[0,1,10],[1,2,10],[2,3,10],[3,4,10],[4,0,10]]))
ইনপুট
5, [[0,1,10],[1,2,10],[2,3,10],[3,4,10],[4,0,10]]
আউটপুট
[[], [0, 1, 2, 3, 4]]