ডিএজি কি একটি ট্রানজিটি হ্রাস?


11

এই চ্যালেঞ্জের লক্ষ্যটিকে একটি সীমাবদ্ধ নির্দেশিত অ্যাসাইক্লিক গ্রাফ (ডিএজি) দেওয়া হয়, গ্রাফটি কোনও ট্রানসিটিভ হ্রাস হয় কিনা তা নির্ধারণ করে ।

ডিএজি এবং ট্রানজিটিভ হ্রাস কী কী তার একটি সংক্ষিপ্ত বিবরণ:

একটি ডিএজি হ'ল নির্দেশিত প্রান্তযুক্ত একটি গ্রাফ (যেমন আপনি কেবল সেই প্রান্তে কেবল এক দিকে ভ্রমণ করতে পারেন) যেমন গ্রাফের কোনও প্রারম্ভিক নোড দেওয়া হয় তবে প্রারম্ভিক নোডে ফিরে আসা অসম্ভব (যেমন কোনও চক্র নেই)।

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

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

নোডের পেতে Dথেকে A, আপনি পাথ গ্রহণ করতে পারে A->B->Dবা A->C->D। সুতরাং, Dথেকে পৌঁছনীয় A। তবে নোড Bথেকে শুরু করে নোডে যাওয়ার জন্য এমন কোনও পথ নেই যা নেওয়া যেতে পারে C। সুতরাং, নোড Bনোড থেকে পৌঁছানো যায় না C

গ্রাফের প্রতিটি প্রারম্ভিক নোডের জন্য অ্যাক্সেসযোগ্য নোডগুলির তালিকা হিসাবে গ্রাফের পুনঃব্যবহারযোগ্যতাটি সংজ্ঞায়িত করুন । সুতরাং একই উদাহরণ হীরার গ্রাফের জন্য, পুনরুদ্ধারযোগ্যতাটি হ'ল:

A: [B, C, D]
B: [D]
C: [D]
D: []

উপরের গ্রাফের মতো একই রকমের পুনঃচঞ্চলতা রয়েছে এমন আরও একটি গ্রাফ নীচে দেখানো হয়েছে:

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

তবে এই দ্বিতীয় গ্রাফটিতে মূল গ্রাফের চেয়ে বেশি প্রান্ত রয়েছে। কোনও গ্রাফের ট্রানজিটি হ্রাস হ'ল একটি গ্রাফ যা মূল গ্রাফের সর্বনিম্ন সংখ্যার এবং একই রকমের সম্ভাবনাময়। সুতরাং প্রথম গ্রাফটি হ'ল দ্বিতীয়টির ট্রানজিটি হ্রাস।

একটি সসীম DAG এর জন্য, অস্থায়ী হ্রাস বিদ্যমান থাকার গ্যারান্টিযুক্ত এবং এটি অনন্য।

ইনপুট

ইনপুটটি একটি "তালিকাগুলির তালিকা", যেখানে বাহ্যিক তালিকার শীর্ষে সংখ্যাটির দৈর্ঘ্য রয়েছে এবং প্রতিটি অভ্যন্তরীণ তালিকাটি সম্পর্কিত নোডটি ছেড়ে আসা প্রান্তগুলির দৈর্ঘ্য এবং এতে গন্তব্য নোডের সূচক রয়েছে। উদাহরণস্বরূপ, উপরের প্রথম গ্রাফটি বর্ণনা করার একটি উপায় হ'ল (শূন্য ভিত্তিক সূচক ধরে নেওয়া):

[[1, 2], [3], [3], []]

আপনি যেকোন স্বেচ্ছাচারিত পূর্ণসংখ্যার মান (উদাহরণস্বরূপ 0 বা 1 ভিত্তিক সূচক) -এ প্রথম নোডের সূচনা শুরু করতে পারেন।

ইনপুটটি যে কোনও ইনপুট উত্স পছন্দসই (stdio, ফাংশন প্যারামিটার, ইত্যাদি) থেকে আসতে পারে। যতক্ষণ পর্যন্ত কোনও অতিরিক্ত তথ্য না দেওয়া হয় আপনি সঠিক ইনপুট ফর্ম্যাটটি চয়ন করতে পারেন। উদাহরণস্বরূপ, আপনি stdio থেকে ইনপুট নিতে চান, আপনি প্রতিটি লাইন সংশ্লিষ্ট নোড জন্য প্রান্ত একটি তালিকা হতে পারে। প্রাক্তন .:

1 2
3
3
'' (blank line)

প্রতিটি সংলগ্ন তালিকার সূচকগুলি প্রয়োজনীয়ভাবে বাছাই করা হয় না এবং দুটি নোডের সাথে সংযুক্ত একাধিক প্রান্ত থাকতে পারে (প্রাক্তন [[1,1],[]]:)। আপনি ধরে নিতে পারেন ইনপুট গ্রাফটি দুর্বলভাবে সংযুক্ত রয়েছে এবং এতে কোনও চক্র নেই (যেমন এটি একটি ডিএজি)।

আউটপুট

প্রদত্ত ইনপুট ডিএজি একটি ট্রানসিটিভ হ্রাস এবং অন্যথায় মিথ্যা মান বলে যদি আউটপুট সত্য হয়। এটি যে কোনও সিঙ্ক পছন্দসই হতে পারে (স্টিডিও, রিটার্ন মান, আউটপুট প্যারামিটার ইত্যাদি)

উদাহরণ

সমস্ত উদাহরণ 0-ভিত্তিক সূচক ব্যবহার করে।

[[1,2],[3],[3],[]]
true

[[1,2,3],[3],[3],[]]
false

[[1,1],[]]
false

[[1,2,3,4],[5,6,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true

[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
true

[[5,6,7],[2,3,0,4,14,5,7],[5,8,9],[6,8,10],[7,9,10],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false

[[5,6,7],[2,3,0,4],[5,8,9],[6,8,10],[7,9,10,14],[11,12],[11,13],[12,13],[11,14],[12,14],[13,14],[],[],[],[]]
false

[[1,3],[2],[3],[]]
false

স্কোরিং

এটি কোড গল্ফ; বাইটস মধ্যে ক্ষুদ্রতম কোড। আপনার কোডটি একটি যুক্তিসঙ্গত পরিমাণে শেষ করা উচিত (আপনার কাছে যা কিছু হার্ডওয়্যার রয়েছে তার চেয়ে 10 মিনিট সর্বাধিক)। স্ট্যান্ডার্ড লুফোলস প্রযোজ্য। আপনি পছন্দসই কোনও বিল্ট-ইন ব্যবহার করতে পারেন।


আমরা কি ইনপুট সংযোগ সম্পর্কে কোন অনুমান করতে পারি? (আমি আপনার সমস্ত পরীক্ষার কেসগুলি পরীক্ষা করে দেখিনি, তবে তারা কি গ্রাফের একাধিক সংযোগ বিচ্ছিন্ন অংশগুলি কভার করে?)
মার্টিন ইন্ডার

আমি বিশ্বাস করি তা দিয়ে আপডেট হয়েছে সঠিক ভাষা।
helloworld922

আমার ধারণা ঠিক আছে। আপনি আরও বলতে পারেন যে গ্রাফটি দুর্বলভাবে সংযুক্ত
মার্টিন ইন্ডার

উত্তর:


5

রুবি, 101 97 বাইট

সহজ পদ্ধতির যা প্রতিটি নোড থেকে নাগালের গণনা করে এবং বিবেচনা করে যে কোনও শিশু নোড অন্য কোনও নোডের মাধ্যমে পৌঁছানো যায় কিনা। চক্রীয় গ্রাফগুলিতে আপাতদৃষ্টিতে ব্যর্থ হয় তবে কোনও ড্যাগের সংজ্ঞাটি বোঝায় যে এটি কোনওভাবেই চক্রযুক্ত হওয়া উচিত নয়।

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

->g{r=->i{i|i.map{|j|r[g[j]||[]]}.inject([],:|)}
g.all?{|e|e==e&e&&e.none?{|i|r[e-[i]].index i}}}

4

গণিত, 95 82 বাইট

@ মার্টিনএেন্ডারের কারণে 13 বাইট সংরক্ষণ করা হয়েছে ।

#~IsomorphicGraphQ~TransitiveReductionGraph@#&@Graph[x=0;##&@@Thread[++x->#]&/@#]&

বেনামে ফাংশন। (1-ভিত্তিক) ইনপুট হিসাবে নেস্টেড তালিকা নেয় এবং রিটার্ন দেয় Trueবা Falseআউটপুট হিসাবে। এখানে প্রধান সমাধান হ'ল 46-বাইট #~IsomorphicGraphQ~TransitiveReductionGraph@#&, যা পরীক্ষা করে যদি কোনও প্রদত্ত গ্রাফ তার ট্রানজিটি হ্রাসকে আইসোমরফিক হয়। বাকিগুলি ইনপুটটিকে কোনও Graphবস্তুতে রূপান্তর করে ।


3

সিজেএম (৪১ বাইট)

q~:A_,{{Af=e__&}%_}*]:.|A.&A:$:e`e_2%1-*!

অনলাইন ডেমো , পরীক্ষার জোতা

ব্যবচ্ছেদ

q~:A      e# Parse input and store in A
_,{       e# Loop V times
  {       e#   Extend adjacency list representation of G^i to G^(i+1)
    Af=   e#   by extending each path by one edge
    e__&  e#   and flattening. NB :| would be shorter but breaks for empty lists
  }%
  _       e#   Duplicate, so that we build up G^2, G^3, ..., G^n
}*]       e# Gather in a single array
:.|       e# Fold pointwise union, giving the reachability from each vertex by
          e# paths of length > 1
A.&       e# Pointwise intersect with the paths of length 1
          e# We hope to get an array of empty arrays

          e# Handle the awkward special case of duplicate edges:
A:$       e# Sort each adjacency list
:e`       e# Run-length encode each adjacency list
e_2%      e# Extract only the run lengths
1-        e# Discard the 1s - so we now have an empty array unless there's a dupe

*         e# Join. We hope to be joining an array of empty arrays by an empty array
          e# giving an empty array
!         e# Check that we get a falsy value (i.e. the empty array)

3

জেলি, 20 বাইট

ị³$ÐĿ€ị@Fœ&¥";œ-Q$€E

1-ভিত্তিক সূচক ব্যবহার করে। এটি অনলাইন চেষ্টা করুন!

আলগা পর্যালোচনা

     €                for each vertex,
ị³$ÐĿ                   compute its reach.
        Fœ&¥"         intersect each vertex's lists of children and
      ị@                children's reaches.
             ;        then concatenate the list of intersections with
              œ-Q$€     all duplicate edges in the original graph.
                   E  are all elements equal? checks that all are empty lists,
                        meaning empty intersections and no duplicates.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.