টপোলজিকাল ধরণের মোট সংখ্যা


11

প্রদত্ত ডিএজি (নির্দেশিত অ্যাসাইক্লিক গ্রাফ) এর জন্য এর প্রতিটি টপোলজিকাল প্রকার হ'ল সমস্ত অনুভূমিকের অনুক্রম, যেখানে ড্যাগের প্রতিটি প্রান্তের (ইউ, ভি) জন্য, আপনি ক্রমের মধ্যে ভি এর আগে উপস্থিত হন ।

আপনার কাজটি প্রদত্ত ডিএজি-র টপোলজিক্যাল ধরণের মোট সংখ্যা গণনা করা।

বিধি

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

উদাহরণ

এটি বিভিন্ন ফর্ম্যাটে একই ইনপুট। আপনার প্রোগ্রামটি তাদের সমস্ত গ্রহণ করতে হবে না। শীর্ষস্থানগুলি সর্বদা 0 থেকে শুরু হয় পূর্ণসংখ্যা হয়।

Adjacency list:
[ [1 2 3 5] [2 4] [] [2] [] [3] ]
Adjacency matrix:
[ [0 1 1 1 0 1] [0 0 1 0 1 0] [0 0 0 0 0 0] [0 0 1 0 0 0] [0 0 0 0 0 0] [0 0 0 1 0 0] ]
Edge list:
6 [ [0 1] [0 2] [0 3] [0 5] [1 2] [1 4] [3 2] [5 3] ]

এটি এই চিত্রটিতে প্রদর্শিত গ্রাফটি:

উদাহরণ গ্রাফ

আউটপুটটি হওয়া উচিত:

9

টপোলজিকাল প্রকারগুলি হ'ল:

[0 1 4 5 3 2]
[0 1 5 4 3 2]
[0 1 5 3 4 2]
[0 1 5 3 2 4]
[0 5 1 4 3 2]
[0 5 1 3 4 2]
[0 5 1 3 2 4]
[0 5 3 1 4 2]
[0 5 3 1 2 4]

ফাংশন আছে? পুরো প্রোগ্রাম? উভয় ক্ষেত্রেই?
isaacg

একসাথে
জিমি 23013

উত্তর:


4

সিজেম - 25

q~{_f{1$-_j@j@&!*}_!+:+}j

ব্যবহারকারী 23013 থেকে দুর্দান্ত সহায়তায় :)

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

ব্যাখ্যা:

এক্সনোর পাইথন দ্রবণ হিসাবে সাধারণ অ্যালগরিদম একই ।
এখানে কীটি jঅপারেটর, যা স্মরণীয় পুনরাবৃত্তি করে। প্রাথমিক মান (গুলি) (যেমন চ (0), চ (1), ইত্যাদি) এর জন্য একটি প্যারামিটার, একটি মান বা অ্যারে এবং পুনরাবৃত্তি সংজ্ঞায়িত করতে একটি ব্লক লাগে। jঅপারেটর একই ব্লক রিকার্সিভ (এবং memoized) কল করছেন জন্য ব্লক ভিতরে আবার ব্যবহার করা হয়। এটি একাধিক পরামিতিগুলির সাথেও ব্যবহার করা যেতে পারে, তবে এখানে এটি হয় না।
ব্যবহারকারী23013 এর দুর্দান্ত উদ্ভাবন হ'ল বিভিন্ন ডাটা প্রকারের সাথে জ ব্যবহার করা, সংলগ্ন তালিকাটিকে প্রাথমিক মানগুলির অ্যারে হিসাবে ব্যবহার করা।

q~             read and evaluate the input (vertex list followed by adjacency list)
{…}j           run the block on the vertex list, doing memoized recursion
                and using the adjacency list for initial values
    _          copy the vertex list
    f{…}       for each vertex and the vertex list
        1$-    copy the vertex and remove it from the list
                Python: "V-{v}"
        _j     copy the reduced list and call the j block recursively
                this solves the problem for the reduced vertex list
                Python: "f(G,V-{v})"
        @j     bring the vertex to the top of the stack and call the j block recursively
                in this case, it's called with a vertex rather than a list
                and the memoized value is instantly found in the list of initial values
                effectively, this gets the list of vertices adjacent to the current vertex
                Python: "G[v]"
        @&     bring the reduced list to the top of the stack and intersect
        !*     multiply the number of topological sorts of the reduced vertex list
                with 1 if the intersection was empty and 0 if not
                Python: equivalent to "*(V-G[v]==V)"
               after this loop we get an array of sub-results for the reduced vertex lists
    _!+        add 1 or 0 to the array if the array was empty or not
                because we want to get 1 for the empty array
                Python: equivalent to "V<{0}or"
    :+         add the numbers in the array
                Python: "sum(…)"

1
ইনপুটটিতে স্পষ্টভাবে ভার্টেক্স তালিকার অনুমতি দেওয়ার জন্য সম্পাদিত। এখন 25 বাইট
জিমি 23013

@ user23013 এটি কোন ধরণের যাদু? : ও
অ্যাডিটসু ছেড়ে গেছে কারণ এসই এভিল

7

পাইথন, 58

f=lambda G,V:V<{0}or sum(f(G,V-{v})*(V-G[v]==V)for v in V)

ইনপুটটিতে একটি সংলগ্ন অভিধান Gএবং একটি ভার্টেক্স সেট রয়েছে V

G = {0:{1,2,3,5}, 1:{2,4}, 2:set(), 3:{2}, 4:set(), 5:{3}, 6:set()}
V = {0,1,2,3,4,5}

কোডটি পুনরাবৃত্তিযোগ্য। সেটটি Vএমন সমস্ত নোড সঞ্চয় করে যা এখনও দেখার প্রয়োজন। প্রতিটি সম্ভাব্য পরবর্তী নোডের জন্য, আমরা যদি কোনো অবশিষ্ট ছেদচিহ্ন সঙ্গে, এটা নির্দেশ এইজন্য তার উপযুক্ততা পরীক্ষা V-G[v]==Vপরীক্ষণ যে Vএবং G[v]অসংলগ্ন করা হয়। সমস্ত উপযুক্ত যেমন শিখুন জন্য, আমরা এটি সরানো সঙ্গে টপোলজিকাল প্রকারের সংখ্যা যোগ করুন। বেস কেস হিসাবে, খালি সেটটি 1 দেয়।


প্রান্ত তালিকাটি ব্যবহার না করার জন্য +1।
জিমি 23013

5

গণিত, 80 57 51 বাইট

Count[Permutations@#,l_/;l~Subsets~{2}~SubsetQ~#2]&

সংজ্ঞার খুব সোজা-এগিয়ে প্রয়োগ। আমি কেবল সমস্ত অনুমতি উত্পন্ন করছি এবং তার মধ্যে কতটি বৈধ তা গণনা করছি। কোনও অনুচ্ছেদে বৈধ কিনা তা পরীক্ষা করার জন্য, আমি ক্রমান্বয়ে সমস্ত জোড়ের কোণ পেয়েছি। সুবিধার্থে, Subsets[l,{2}]আমাকে কেবল সমস্ত জোড়া দেয় না, এটি যে ক্রমে তাদের খুঁজে পাওয়া যায় তাও বজায় রাখে l- কেবল আমার যা প্রয়োজন।

উপরেরটি এমন একটি ফাংশন যা ভার্টেক্স তালিকা এবং প্রান্ত তালিকাটি পছন্দ করে

f[{1, 2, 3, 4, 5, 6}, {{1, 2}, {1, 3}, {1, 4}, {1, 6}, {2, 3}, {2, 5}, {4, 3}, {6, 4}}]

যদি আপনি ফাংশন কল f

আমি এটি গল্ফ করার চেষ্টা করব, বা সম্ভবত পরে অন্য কোনও পদ্ধতি ব্যবহার করব।


2

পাইথ, 27 বাইট

Mlf!sm}_dHfq2lYyTfqSZUZ^UGG

একটি 2 ইনপুট ফাংশন সংজ্ঞায়িত করে g,। প্রথম ইনপুটটি হল শীর্ষে সংখ্যা, দ্বিতীয়টি নির্দেশিত প্রান্তগুলির তালিকা।

পরীক্ষা করার জন্য:

Code:
Mlf!sm}_dHfq2lYyTfqSZUZ^UGGghQeQ

Input:
6, [ [0, 1], [0, 2], [0, 3], [0, 5], [1, 2], [1, 4], [3, 2], [5, 3] ]

এখানে চেষ্টা করুন।


@ user23013 বোথ গণনা এবং তালিকা প্রকাশ করা হচ্ছে ^UGG, যা সমস্ত Gপ্রবেশের তালিকা তৈরি করে range(len(G))
isaacg

আমি বলতে চাইছিলাম, আপনি যদি [0, 1, ...]সরাসরি ইনপুটটিতে ব্যবহার করেন তবে এটি আরও খাটো হবে ?
jimmy23013

@ ব্যবহারকারী23013 না, এটি একই দৈর্ঘ্য হবে: ^GlGবনাম ^UGG
isaacg

2

হাস্কেল, 102 107 100 89 85 বাইট

import Data.List
(%)=elemIndex
n#l=sum[1|p<-permutations[0..n],and[u%p<v%p|[u,v]<-l]]

ইনপুটটি হ'ল সর্বাধিক শীর্ষটি সংখ্যা (0 দিয়ে শুরু) এবং একটি প্রান্ত তালিকা, যেখানে একটি প্রান্ত দুটি উপাদান তালিকা is ব্যবহারের উদাহরণ:5 # [[0,1], [0,2], [0,3], [0,5], [1,2], [1,4], [3,2], [5,3]]

এটি কিভাবে কাজ করে: সব একাধিক বিন্যাসন গণনা pছেদচিহ্ন, যার জন্য সব প্রান্ত [u,v]সন্তুষ্ট: অবস্থান uমধ্যে pকম পদে চেয়ে vমধ্যে p। এটি সংজ্ঞাটির প্রত্যক্ষ বাস্তবায়ন।

সম্পাদনা করুন: আমার প্রথম সংস্করণটি টপোলজিকাল প্রকারগুলি নিজেরাই ফিরিয়েছে এবং সেখানে কতগুলি নেই। ঠিক কর.

দ্বিতীয় সম্পাদনা করুন: সংযুক্ত নয় এমন শীর্ষাংশ সহ গ্রাফের জন্য কাজ করেননি। ঠিক কর.


আমি কেবল প্রান্ত দিয়ে একটি পরীক্ষার কেস যুক্ত করার কথা ভাবছি তবে কিনারা নয় ...
জিমি 23013

@ ইউজার ২৩০১৩: এখন সংযুক্ত নয়, উল্টোটি সহ গ্রাফগুলির জন্য কাজ করে। এটি আরও খাটো হয়ে যায়।
নিমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.