একটি সংযুক্ত পুনঃনির্দেশিত গ্রাফটি বিবেচনা করুন। এই গ্রাফটিতে প্রান্তের একটি মিলের সেটটি প্রান্তের সেট হিসাবে সংজ্ঞায়িত করা হয়েছে যে সেটটিতে কোনও দুটি প্রান্ত একটি সাধারণ ভার্টেক্স ভাগ করে না। উদাহরণস্বরূপ, বাম চিত্রটি একটি সবুজ রঙের মিলের সেটকে বোঝায়, অন্যদিকে ডান চিত্রটি একটি নন-ম্যাচিং লালকে বর্ণিত করে।
একটি ম্যাচিং সেট বলে maximally matching
, বা একটি maximal matching
যদি মিলের সেটটিতে গ্রাফের অন্য প্রান্তটি যুক্ত করা অসম্ভব হয়। সুতরাং উপরের দুটি উদাহরণই সর্বাধিক মিলের সেট নয়, তবে নীচে নীচের দুটি সেটই সর্বাধিক মিল রয়েছে। নোট করুন যে সর্বাধিক মিলগুলি অগত্যা অনন্য নয়। তদতিরিক্ত, কোনও গ্রাফের জন্য প্রতিটি সম্ভাব্য সর্বাধিক মিলের আকার অন্য মিলের সমান হওয়ার প্রয়োজন নেই।
এই চ্যালেঞ্জের লক্ষ্য হ'ল একটি গ্রাফের সর্বাধিক মিল খুঁজে পেতে একটি প্রোগ্রাম / ফাংশন লিখুন।
ইনপুট
ধরুন ইনপুট গ্রাফের সমস্ত শীর্ষে আপনার পছন্দের কোনও শুরুর পূর্ণসংখ্যার মান থেকে শুরু করে কিছু ধারাবাহিক পূর্ণসংখ্যার সংখ্যা রয়েছে। একটি প্রান্তটি বিন্যাসিত জোড় দ্বারা সংখ্যার প্রান্তটি সংযোগ করে এমনটি চিহ্নিত করে is উদাহরণস্বরূপ, উপরে উল্লিখিত গ্রাফটি নীচের দিকের নিখরচায় সেট সহ বর্ণিত হতে পারে (অনুমান করে যে শীর্ষের সংখ্যা 0 থেকে শুরু হবে):
[(0,1), (0,2), (1,3), (1,4), (2,3), (3,4), (3,5), (5,6)]
গ্রাফটি বর্ণনা করার একটি বিকল্প উপায় সংলগ্ন তালিকার মাধ্যমে। উপরের গ্রাফের জন্য এখানে সংলগ্নতার একটি উদাহরণ রয়েছে:
[0:(1,2), 1:(0,3,4), 2:(0,3), 3:(1,2,4,5), 4:(1,3), 5:(3,6), 6:(5)]
আপনার প্রোগ্রাম / ফাংশনটি কোনও উত্স (স্টিডিও, ফাংশন প্যারামিটার ইত্যাদি) থেকে ইনপুট হিসাবে গ্রাফ নিতে হবে। কোনও অতিরিক্ত অ-তুচ্ছ তথ্য আপনার প্রোগ্রামটিতে জানানো না হওয়ায় আপনি কাঙ্ক্ষিত কোনও স্বরলিপি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ইনপুট প্রান্তের সংখ্যা বোঝাতে একটি অতিরিক্ত প্যারামিটার থাকা পুরোপুরি গ্রহণযোগ্য। একইভাবে, কিনারা, সংলগ্ন তালিকা বা সংলগ্ন ম্যাট্রিক্সের একটি আনর্ডারড মাল্টিসেটে পাস করা ভাল।
আপনি ধরে নিতে পারেন:
- গ্রাফটি সংযুক্ত আছে (উদাঃ যে কোনও প্রারম্ভিক ভার্টেক্স প্রদত্ত যে কোনও প্রান্তে পৌঁছানো সম্ভব)।
- কমপক্ষে একটি প্রান্ত আছে।
- একটি প্রান্ত কখনই কোনও ভার্টেক্স সরাসরি নিজের সাথে সংযুক্ত করে না (উদাঃ প্রান্তটি
(1,1)
ইনপুট হিসাবে দেওয়া হবে না)। নোট করুন যে চক্রগুলি এখনও সম্ভব (উদাহরণস্বরূপ: উপরের গ্রাফগুলি)। - আপনার প্রয়োজন হতে পারে যে ইনপুট শিখুনগুলি কোনও সূচকে শুরু হয় (যেমন প্রথম শীর্ষটি 0, 1, -1 ইত্যাদি হতে পারে)।
- আপনার নির্বাচিত প্রারম্ভিক সূচক (প্রাক্তন:,
1,2,3,4,...
বা0,1,2,3,...
) থেকে ক্রমবর্ধমান সংখ্যাটি ক্রমান্বয়ে বৃদ্ধি পাচ্ছে ।
আউটপুট
আপনার প্রোগ্রাম / ফাংশনটিতে সর্বাধিক মিলের সেটটি চিহ্নিত করে প্রান্তগুলির একটি তালিকা আউটপুট করা উচিত। একটি প্রান্ত দুটি প্রান্তকে সংজ্ঞায়িত করা হয় যা প্রান্তটি সংযোগ করে। যাত্রা। বাম নীল সেট জন্য আউটপুট (উদাহরণ ইনপুট ভারটেক্স ক্রম ব্যবহার করে):
[(1,4), (2,3), (5,6)]
দ্রষ্টব্য ক্রমটি গুরুত্বপূর্ণ নয়; সুতরাং নিম্নলিখিত আউটপুট একই মিলের সেট বর্ণনা করে:
[(4,1), (2,3), (6,5)]
আউটপুট স্টডআউট, একটি ফাইল, ফাংশন রিটার্ন মান ইত্যাদি হতে পারে etc.
উদাহরণ
এখানে কয়েকটি উদাহরণ ইনপুট রয়েছে (সংলগ্ন তালিকার ফর্ম্যাটটি ব্যবহার করে)। এই উদাহরণগুলিতে উল্লম্ব গণনা শুরু করতে ঘটে 0
।
দ্রষ্টব্য যে কোনও উদাহরণ আউটপুট দেওয়া হয় না, পরিবর্তে আমি একটি পাইথন 3 বৈধকরণ কোড অন্তর্ভুক্ত করেছি।
[0:(1), 1:(0)]
[0:(1,2), 1:(0,3,4), 2:(0,3), 3:(1,2,4,5), 4:(1,3), 5:(3,6), 6:(5)]
[0:(1,2), 1:(0,2,3,4,5), 2:(0,1), 3:(1), 4:(1), 5:(1)]
[0:(1,2), 1:(0,2,3), 2:(0,1,4), 3:(1,4,5), 4:(2,3), 5:(3)]
বৈধতা পাইথন 3 কোড
এখানে একটি পাইথন 3 বৈধকরণ কোড রয়েছে যা গ্রাফ এবং প্রান্তগুলির সেট নেয় এবং সেটটি সর্বাধিক মিলছে কিনা তা প্রিন্ট করে। এই কোডটি কোনও ভার্টেক্স সূচনা সূচকের সাথে কাজ করে।
def is_maximal_matching(graph, edges):
'''
Determines if the given set of edges is a maximal matching of graph
@param graph a graph specified in adjacency list format
@param edges a list of edges specified as vertex pairs
@return True if edges describes a maximal matching, False otherwise.
Prints out some diagnostic text for why edges is not a maximal matching
'''
graph_vtxs = {k for k,v in graph.items()}
vtxs = {k for k,v in graph.items()}
# check that all vertices are valid and not used multiple times
for e in edges:
if(e[0] in graph_vtxs):
if(e[0] in vtxs):
vtxs.remove(e[0])
else:
print('edge (%d,%d): vertex %d is used by another edge'%(e[0],e[1],e[0]))
return False
else:
print('edge (%d,%d): vertex %d is not in the graph'%(e[0],e[1],e[0]))
return False
if(e[1] in graph_vtxs):
if(e[1] in vtxs):
vtxs.remove(e[1])
else:
print('edge (%d,%d): vertex %d is used by another edge'%(e[0],e[1],e[1]))
return False
else:
print('edge (%d,%d): vertex %d is not in the graph'%(e[0],e[1],e[0]))
return False
if(e[1] not in graph[e[0]]):
print('edge (%d,%d): edge not in graph'%(e[0],e[1]))
return False
# check that any edges can't be added
for v in vtxs:
ovtxs = graph[v]
for ov in ovtxs:
if(ov in vtxs):
print('could add edge (%d,%d) to maximal set'%(v,ov))
return False
return True
ব্যবহারের উদাহরণ:
graph = {0:[1,2], 1:[0,3,4], 2:[0,3], 3:[1,2,4,5], 4:[1,3], 5:[3,6], 6:[5]}
candidate = [(0,1),(2,3)]
is_maximal_matching(graph, candidate) // False
candidate = [(0,1),(2,3),(5,6),(0,1)]
is_maximal_matching(graph, candidate) // False
candidate = [(0,1),(2,3),(5,6)]
is_maximal_matching(graph, candidate) // True
স্কোরিং
এটি কোড গল্ফ; সংক্ষিপ্ততম কোড জয় স্ট্যান্ডার্ড লুফোলস প্রযোজ্য। আপনি পছন্দসই কোনও বিল্ট-ইন ব্যবহার করতে পারেন।
[[0 1] [3 4]]
এটি সর্বাধিক সেট পরিবর্তে প্রদান করে তৃতীয় উদাহরণে ব্যর্থ[[0 2] [1 4] [3 5]]
। (আমি(1, 1)
ভুলক্রমে সেখানে যে প্রান্তটি মনে হচ্ছে তা উপেক্ষা করছি )