সর্বাধিক মিলের প্রান্তগুলির একটি সেট খুঁজুন


13

একটি সংযুক্ত পুনঃনির্দেশিত গ্রাফটি বিবেচনা করুন। এই গ্রাফটিতে প্রান্তের একটি মিলের সেটটি প্রান্তের সেট হিসাবে সংজ্ঞায়িত করা হয়েছে যে সেটটিতে কোনও দুটি প্রান্ত একটি সাধারণ ভার্টেক্স ভাগ করে না। উদাহরণস্বরূপ, বাম চিত্রটি একটি সবুজ রঙের মিলের সেটকে বোঝায়, অন্যদিকে ডান চিত্রটি একটি নন-ম্যাচিং লালকে বর্ণিত করে।

এখানে চিত্র বর্ণনা লিখুন

একটি ম্যাচিং সেট বলে 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. গ্রাফটি সংযুক্ত আছে (উদাঃ যে কোনও প্রারম্ভিক ভার্টেক্স প্রদত্ত যে কোনও প্রান্তে পৌঁছানো সম্ভব)।
  2. কমপক্ষে একটি প্রান্ত আছে।
  3. একটি প্রান্ত কখনই কোনও ভার্টেক্স সরাসরি নিজের সাথে সংযুক্ত করে না (উদাঃ প্রান্তটি (1,1)ইনপুট হিসাবে দেওয়া হবে না)। নোট করুন যে চক্রগুলি এখনও সম্ভব (উদাহরণস্বরূপ: উপরের গ্রাফগুলি)।
  4. আপনার প্রয়োজন হতে পারে যে ইনপুট শিখুনগুলি কোনও সূচকে শুরু হয় (যেমন প্রথম শীর্ষটি 0, 1, -1 ইত্যাদি হতে পারে)।
  5. আপনার নির্বাচিত প্রারম্ভিক সূচক (প্রাক্তন:, 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

স্কোরিং

এটি কোড গল্ফ; সংক্ষিপ্ততম কোড জয় স্ট্যান্ডার্ড লুফোলস প্রযোজ্য। আপনি পছন্দসই কোনও বিল্ট-ইন ব্যবহার করতে পারেন।

উত্তর:


9

সিজাম (১rs টি অক্ষর)

{M\{_2$&!*+}/2/}

অনলাইন ডেমো

এটি একটি লোভী দৃষ্টিভঙ্গি যা প্রান্তগুলি জমা করে যার পূর্বে জমে থাকা প্রান্তগুলির সাথে কোনও ভার্টেক্স মিল নেই।


আমি নিশ্চিত যে [[0 1] [3 4]]এটি সর্বাধিক সেট পরিবর্তে প্রদান করে তৃতীয় উদাহরণে ব্যর্থ [[0 2] [1 4] [3 5]]। (আমি (1, 1)ভুলক্রমে সেখানে যে প্রান্তটি মনে হচ্ছে তা উপেক্ষা করছি )
ETH প্রোডাকশনগুলি

@ ইথ প্রডাকশনস, আপনি সর্বোচ্চ সহ সর্বাধিক বিভ্রান্ত করছেন।
পিটার টেলর

3
ডাঙ্গিত, এর জন্য দুঃখিত ... আমি যদি আপনার কিছু মনে না করি তবে বিভ্রান্ত হওয়া অন্য যে কোনও ব্যক্তিকে সাহায্য করার জন্য আমি আমার মন্তব্যটি ছেড়ে দেব, যেহেতু এটি একটি পুনরাবৃত্তিযোগ্য সমস্যা বলে মনে হচ্ছে :
পি

7

পাইথ , 8 বাইট

ef{IsTty
       y  power set (gerenate all set of edges)
      t   remove the first one (the first one is
          empty and will cause problems)
 f        filter for sets T satisfying:
     T        T
    s         flatten
  {I          is invariant under deduplicate, i.e. contains no
              duplicating vertices, as the elements represent vertices
e         pick the last one (the power set is ordered from
          smallest to largest)

এটি অনলাইন চেষ্টা করুন!

চশমা

  • ইনপুট: [(0,1), (0,2), (1,3), (1,4), (2,3), (3,4), (3,5), (5,6)]
  • আউটপুট: [(1, 4), (2, 3), (5, 6)]

6

ওল্ফ্রাম ভাষা, 25 22 বাইট

সংরক্ষিত 3 বাইট @ মার্টিনইেন্ডারকে ধন্যবাদ

FindIndependentEdgeSet

এটি কোনও Graphঅবজেক্ট হিসাবে ইনপুট নেয় ( Graph[{1<->2,2<->3,1<-3>}]ইত্যাদি হিসাবে সংজ্ঞায়িত )


আপনি প্রয়োজন হবে না @#&
মার্টিন এন্ডার

ধন্যবাদ
স্কট মিলনার

Pfft। import solve_problem; run()। এখন কাউকে কেবল ওল্ফ্রামের জন্য একটি প্লাগইন লিখতে হবে যা একটি কোডগল্ফ চ্যালেঞ্জ ইউআরএল নেয় এবং পছন্দসই আউটপুট আউটপুট দেয়। ফোন করুন Golf
ড্রাকো

5

ব্র্যাচল্যাগ , 5 বাইট

 ⊇.c≠∧

?⊇.cL≠   implicit ? at the beginning;
         ∧ breaks implicit . at the end;
         temporary variable inserted.
?⊇.      input is a superset of output
  .cL    output concatenated is L
    L≠   L contains distinct elements

এটি অনলাইন চেষ্টা করুন!

এটি সর্বোচ্চ হিসাবে গ্যারান্টিযুক্ত, যেহেতু ব্র্যাচল্যাগ বৃহত্তম সাবসেট থেকে অনুসন্ধান করে।


আমি মনে করি যে আপনার ব্যাখ্যায় আপনার আসল কোডের চেয়ে আলাদা কোড রয়েছে।
এরিক আউটগল্ফার

@ এরিকথ আউটগলফার এটি কারণ আমি এমন অক্ষরগুলি sertedোকালাম যা আমার ব্যাখ্যাতে অন্তর্ভুক্ত। মূল কোডটি প্রথম লাইনে is ব্র্যাচল্যাগ এই দিকটিতে বেশ পরিশ্রুত।
লিকি নুন

আমি এটির অর্থ চাই না, তবে প্রথম কোডটি শেষ হয় ≠∧, যখন দ্বিতীয় কোডটি শেষ হয় L≠
এরিক আউটগল্ফার

ছাড়া , .শেষে একটি অন্তর্নিহিত হবে। এখানে সমস্ত অর্থ হ'ল .শেষটি sertedোকানো হবে না।
লিকি নুন

Lএকটি অস্থায়ী পরিবর্তনশীল যে কোথাও না ব্যবহার করা হয় অত: পর তার ক্ষমতা বাদ দেওয়া যেতে হয়।
লিকি নুন

0

জাভাস্ক্রিপ্ট (ES6), 67 বাইট

let f =
a=>a.map(b=>r.some(c=>c.some(d=>~b.indexOf(d)))||r.push(b),r=[])&&r

let g = a => console.log("[%s]", f(a).map(x => "[" + x + "]").join(", "))
g([[0,1]])
g([[0,1], [0,2], [1,3], [1,4], [2,3], [3,4], [3,5], [5,6]])
g([[0,1], [0,2], [1,2], [1,3], [1,4], [1,5]])
g([[0,1], [0,2], [1,2], [1,3], [2,4], [3,4], [3,5]])

সর্বাধিক গল্ফতার জন্য লোভী পদ্ধতির ব্যবহার করে।


0

জাভাস্ক্রিপ্ট (ES6), 68 66 বাইট

f=a=>a[0]?[a[0],...f(a.filter(b=>!a[0].some(c=>~b.indexOf(c))))]:a
f=([b,...a])=>b?[b,...f(a.filter(c=>!c.some(c=>~b.indexOf(c))))]:a

আমি ভেবেছিলাম যে আমি পুনরাবৃত্তির পদ্ধতির দিকে যেতে পারি এবং @ ইটিআর প্রডাকশনের সেট ছেদ করার কৌশলটি চুরি করে আমি তার উত্তরটি ছাপিয়েছি!

আমি আসল প্রশ্নটি ভুলভাবে পড়ার প্রথম ব্যক্তি নই, এবং আমি নিম্নলিখিত পুনরাবৃত্ত ফাংশনটি জমা দিতে যাচ্ছিলাম যা সর্বাধিক মিলে যাওয়া প্রান্তের সেটের পরিবর্তে সর্বাধিক মেলানো প্রান্তগুলির সন্ধান করে। সূক্ষ্ম পার্থক্য, আমি জানি!

f=a=>a.map(([b,c])=>[[b,c],...f(a.filter(([d,e])=>b-d&&b-e&&c-d&&c-e))]).sort((d,e)=>e.length-d.length)[0]||[]

সহজ পুনরাবৃত্তি পদ্ধতির। প্রতিটি ইনপুট উপাদানগুলির জন্য, সেট থেকে সমস্ত বিবাদী প্রান্তগুলি মুছুন এবং অবশিষ্ট উপসেটের মিলমান প্রান্তগুলির সর্বাধিক সেটটি সন্ধান করুন, তারপরে প্রতিটি ইনপুট উপাদানটির সর্বাধিক ফলাফল সন্ধান করুন। বড় সেটগুলির জন্য কিছুটা অকার্যকর (9-বাইট স্পিড-আপ সম্ভব)।


0

জেলি , 12 11 বাইট

FQ⁼F
ŒPÇÐfṪ

এটি অনলাইন চেষ্টা করুন!

নমুনা ইনপুট: [0,1],[0,2],[1,3],[1,4],[2,3],[3,4],[3,5],[5,6]

নমুনা আউটপুট: [[1, 4], [2, 3], [5, 6]]

কিভাবে এটা কাজ করে

FQ⁼F    - Helper function, returns 1 if a set of edges is non-matching
F       - Flatten input
 Q      - Remove repeated elements
  ⁼     - Return boolean value. Is this equal to
   F    - The flattened input list

ŒPÇÐfṪ - Main link.
ŒP     - Power set of input list of edges
   Ðf  - Remove all elements which return 1 if
  Ç    - (Helper function) it is a non-matching set
     Ṫ - Get the last element in the resultant list (the longest). 
           Always maximal because it is the longest, so any
           edge added would not be in this list (not matching)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.