এটা কি দ্বিপক্ষীয়?


13

একটি দ্বিপক্ষীয় গ্রাফ এমন একটি গ্রাফ যার প্রান্তকে দুটি বিযুক্ত সেটগুলিতে ভাগ করা যায়, যেমন কোনও প্রান্ত একই সেটে দুটি শীর্ষে সংযোগ স্থাপন করে না। একটি গ্রাফ দ্বিপক্ষীয় হয় এবং কেবল যদি এটি 2-রঙিন হয়।


চ্যালেঞ্জ

আপনার কাজটি হ'ল কোনও অনির্দেশিত সরল গ্রাফের সংলগ্ন ম্যাট্রিক্স দেওয়া হয়, এটি দ্বিপক্ষীয় গ্রাফ কিনা তা নির্ধারণ করুন। এটি, যদি একটি প্রান্তটি i এবং j এর উভয় কোণকে সংযুক্ত করে তবে উভয় (i, j) এবং (j, i) ম্যাট্রিক্সের প্রবেশ 1 হয়।

যেহেতু গ্রাফটি পুনঃনির্দেশিত এবং সাধারণ, তাই এর সংলগ্ন ম্যাট্রিক্স প্রতিসম হয় এবং কেবল 0 এবং 1 থাকে।

সুনির্দিষ্ট

আপনার ইনপুট হিসাবে এন-বাই-এন ম্যাট্রিক্স নেওয়া উচিত (যে কোনও আকারে, যেমন তালিকার তালিকা, স্ট্রিংগুলির তালিকা, সি-এর মতো int**আকার এবং আকার, সমতল অ্যারে, কাঁচা ইনপুট ইত্যাদি)।

যদি গ্রাফ দ্বিপক্ষীয় হয় এবং অন্যথায় মিথ্যা হয় তবে ফাংশন / প্রোগ্রামটির / সত্যের মানটি আউটপুট করা উচিত।

পরীক্ষার কেস

['00101',
 '00010',
 '10001',
 '01000',
 '10100'] : False
['010100',
 '100011',
 '000100',
 '101000',
 '010000',
 '010000'] : True (divide into {0, 2, 4, 5} and {1, 3})
['00',
 '00'] : True

স্কোরিং

উত্তরগুলি সরাসরি গণনা করে এমন বিল্টিনগুলি নিষিদ্ধ করা হয়।

এটি , তাই এই মাসের শেষে সংক্ষিপ্ততম প্রোগ্রাম (বাইটে) জিতেছে!


সম্পর্কিত , এবং প্রকৃতপক্ষে সীমান্তরেখা ডুপ, কারণ দ্বিপক্ষীয় হওয়া কোনও বিজোড় চক্র না থাকার সমতুল্য, এবং এই প্রশ্নের বেশিরভাগ উত্তর সমস্ত চক্রকে গণনা করে এবং তার দৈর্ঘ্য পরীক্ষা করে কাজ করে।
পিটার টেলর

@ পিটারটেলর হ্যাঁ, তবে এই সমস্যাটি সমাধান করার সহজ উপায় রয়েছে।
কোলেরা সু

@ কলেরাশু সত্যতা / মিথ্যা পরিবর্তনের পরিবর্তে, আমরা কি -1মিথ্যা এবং সত্যের জন্য কোনও অ-নেতিবাচক পূর্ণসংখ্যার জন্য ফিরে আসতে পারি?
মিঃ এক্সকোডার

@ মিশা লাভরভ 0-> মিথ্যা, >0-> সত্যবাদী সাধারণত মানক সত্যবাদী / মিথ্যা বিধি দ্বারা অনুমোদিত। -1এবং ≥ 0এটি সাধারণ নয়, এজন্যই আমি জিজ্ঞাসা করেছি।
মিঃ এক্সকডার

@ মিঃ এক্সকোডার এটি ঠিক আছে।
কোলেরা সু

উত্তর:


4

হুশ , 17 বাইট

§V¤=ṁΣṠMSȯDfm¬ṀfΠ

যদি গ্রাফ দ্বিপক্ষীয় হয় তবে একটি ধনাত্মক পূর্ণসংখ্যা মুদ্রণ করে 0এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

এটি একটি নিখুঁত বলের পদ্ধতির: সমস্ত অনুচ্ছেদের এস এর শিখর দিয়ে পুনরাবৃত্তি করুন এবং দেখুন গ্রাফের সমস্ত প্রান্তগুলি এস এবং এর পরিপূরকের মধ্যে রয়েছে কিনা ।

§V¤=ṁΣṠMSȯDfm¬ṀfΠ  Implicit input: binary matrix M.
                Π  Cartesian product; result is X.
                   Elements of X are binary lists representing subsets of vertices.
                   If M contains an all-0 row, the corresponding vertex is never chosen,
                   but it is irrelevant anyway, since it has no neighbors.
                   All-1 rows do not occur, as the graph is simple.
      ṠM           For each list S in X:
              Ṁf   Filter each row of M by S, keeping the bits at the truthy indices of S,
        S  fm¬     then filter the result by the element-wise negation of S,
         ȯD        and concatenate the resulting matrix to itself.
                   Now we have, for each subset S, a matrix containing the edges
                   from S to its complement, twice.
§V                 1-based index of the first matrix
  ¤=               that equals M
    ṁΣ             by the sum of all rows, i.e. total number of 1s.
                   Implicitly print.

@ মিঃ এক্সকোডার ওয়েল, ধরুন M = [[1,2,3],[4,5,6],[7,8,9]]এবং S = [1,0,1]( Mপ্রোগ্রামে সর্বদা বাইনারি ম্যাট্রিক্স হয় তবে এইভাবে ব্যাখ্যা করা আরও সহজ)। প্রতিটি সারি ফিল্টারিং Mদ্বারা Sদেয় [[1,3],[4,6],[7,9]]: প্রতিটি সারির জন্য, আমি ঐ সূচকের এ উপাদান যেখানে অপসারণ Sএকটি 0. হয়েছে তখন আমি অস্বীকার Sউপাদান ভিত্তিক পেতে [0,1,0], এবং ফিল্টার Mযে পেতে [[4,6]]: প্রথম এবং শেষ সারি সংশ্লিষ্ট সূচকের 0 আছে , তাই সেগুলি সরানো হয়।
জাগারব

17

ওল্ফ্রাম ভাষা (গণিত) , 26 25 বাইট a

Tr[#//.x_:>#.#.Clip@x]<1&

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

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

একটি সন্নিহিত অবস্থা ম্যাট্রিক্স একটি প্রদত্ত, আমরা খ = একটি দিয়ে শুরু এবং তারপর দ্বারা বি প্রতিস্থাপন নির্দিষ্ট বিন্দু এটি 2 বি, মাঝে মাঝে 1. 1 থেকে বড় মান ক্লিপিং ট এই প্রক্রিয়ার ধাপে সমতুল্য আপ Clipক্ষমতা খোঁজার জন্য একটি 2 কে + 1 , যাতে (i, j) এন্ট্রিটি 2 টি + 1 এর দৈর্ঘ্যের পাথের সংখ্যাটি শীর্ষবর্গ i থেকে j পর্যন্ত গণনা করে; অতএব স্থির বিন্দুটি একটি nonzero (i, j) প্রবেশের সমাপ্তি ঘটে যদি আমরা একটি অদ্ভুত পদক্ষেপে i থেকে j যেতে পারি।

বিশেষত, স্থির বিন্দুটির তির্যকটি কেবল তখনই নঞ্জেরো এন্ট্রিগুলিতে থাকে যখন একটি শীর্ষবিন্দু বিজোড় সংখ্যক পদক্ষেপে নিজেকে পৌঁছাতে পারে: যদি কোনও বিজোড় চক্র থাকে। সুতরাং নির্দিষ্ট পয়েন্টের ট্রেস 0 হয় এবং কেবল গ্রাফ দ্বিপক্ষীয় হলে।

এই ফর্মের আরও 25 বাইট সমাধান Tr[#O@n//.x_:>#.#.x]===0& যদি এই ক্ষেত্রে কাউকে কীভাবে বাইট গণনাটিকে আরও কম ঠেলা যায় সে সম্পর্কে ধারণা দেয়।

পূর্ববর্তী প্রচেষ্টা

আমি এই উত্তরটি স্থির করার আগে এই উত্তরটির জন্য বেশ কয়েকটি পদ্ধতির চেষ্টা করেছি।

26 বাইট: ম্যাট্রিক্স এক্সপোনেন্টিয়াল

N@Tr[#.MatrixExp[#.#]]==0&

সংলগ্ন ম্যাট্রিক্সের বিজোড় শক্তির উপরও নির্ভর করে। যেহেতু এক্স * EXP (এক্স 2 ) X + X হয় 3 + X 5 /2! + X 7 /4! + ..., যখন এক্স একটি ম্যাট্রিক্স এ, এর এ এর ​​প্রতিটি বিজোড় শক্তির জন্য ইতিবাচক পদ থাকে, সুতরাং এটিতে শূন্য ট্রেসও পাওয়া যাবে যদি এফের একটি বিজোড় চক্র থাকে। বড় ম্যাট্রিক্সের জন্য এই দ্রবণটি খুব ধীর।

29 বাইট: বড় বিজোড় শক্তি

Tr[#.##&@@#~Table~Tr[2#!]]<1&

একটি এন বাই ম্যাট্রিক্স এ এর ​​জন্য, A 2n + 1 সন্ধান করে এবং তারপর তির্যক চেক করে। এখানে, #~Table~Tr[2#!]এন ইনপুট ম্যাট্রিক্স দ্বারা এন এর 2n অনুলিপি তৈরি করা হয় এবং ফলস্বরূপ ম্যাট্রিক্সের 2n + 1 অনুলিপি একসাথে গুণ করে #.##& @@ {a,b,c,d}toa.a.b.c.d

53 বাইট: Laplacian ম্যাট্রিক্স

(e=Eigenvalues)[(d=DiagonalMatrix[Tr/@#])+#]==e[d-#]&

বর্ণালী গ্রাফ তত্ত্বের একটি অস্পষ্ট ফলাফল ব্যবহার করে ( এই পিডিএফের প্রস্তাব 1.3.10 )।


আমি মনে করি আপনি এর সাথে আরও দক্ষ পদ্ধতিটি কয়েক বাইট শেভ করতে পারেন Tr[#.Nest[#.#&,#,Tr[#!]]]<1&। (এটি একটি অবিশ্বাস্য উত্তর যা প্রতিবার আমার দিকে তাকানোর সাথে সাথে আরও ভাল হতে থাকে!)
একটি গাছ নয়

1
এটিতে কম বাইট রয়েছে যে সেমি-বিল্ট-ইন (দুটি ফাংশন প্রয়োজন)BipartiteGraphQ@AdjacencyGraph@#&
কেলি লোডার

2
@ কেলিলাউডার: বড় ম্যাট্রিক্সের জন্য MatrixExpফলাফলকে অবমূল্যায়িত Rootবস্তুর ক্ষেত্রে ফলাফল দেয় যা যুক্ত হওয়ার পরে স্বয়ংক্রিয়ভাবে সরল হয় না। N@বাহিনী এই Rootগুলি সংখ্যাসূচকভাবে যাতে truthiness তারপর মূল্যায়ন করা যাবে গণনা করা হবে।
মাইকেল সিফার্ট

1
@ নোটাত্রি আপনার পন্থাটি সত্যই কয়েকটি বাইট ছাঁটাই করে দেয় তবে তাদের ব্যয় হয়; 18x18 ম্যাট্রিকের জন্য, এটি 1000 গুণ ধীর এবং এটি সেখান থেকে আরও খারাপ হয়। আমি মনে করি যদি আমি এই পরিবর্তনটি করি তবে আমি দক্ষ পদ্ধতিটিকে "দক্ষ" বলার অধিকারটি হারাব।
মিশা লাভরভ

1
@ কেলিলাউডার আপনি এটি সংক্ষিপ্ত করতে পারতেন BipartiteGraphQ@*AdjacencyGraph, তবে এটি আরও দীর্ঘ।
মার্টিন ইন্ডার

3

জাভাস্ক্রিপ্ট, 78 বাইট

m=>!m.some((l,i)=>m.some((_,s)=>(l=m.map(t=>t.some((c,o)=>c&&l[o])))[i]&&s%2))

ইনপুট অ্যারে 0/1 এর অ্যারে, আউটপুট সত্য / মিথ্যা।


2

পাইথ , 25 বাইট

xmyss.D.DRx0dQx1d.nM*FQss

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

এটি -1মিথ্যা, এবং সত্যের জন্য কোনও অ-নেতিবাচক পূর্ণসংখ্যার জন্য ফিরে আসে।

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

xmyss.D.DRx0dQx1d.nM * FQss ~ সম্পূর্ণ প্রোগ্রাম, STDIN থেকে একটি সংলগ্ন ম্যাট্রিক্স গ্রহণ করে receives

                    * এফকিউ car কার্টেসিয়ান পণ্য দ্বারা হ্রাস (ভাঁজ)।
                 .nM each প্রতিটি ফ্ল্যাট করুন।
 m a ভেরিয়েবল সহ মানচিত্র d।
         আরকিউ the ইনপুট প্রতিটি উপাদান জন্য,
       .D index সূচকগুলিতে উপাদানগুলি মুছুন ...
          x0d 0 0 এর সমস্ত সূচী।
     .D ~ এবং এই তালিকা থেকে, সূচকগুলিতে উপাদানগুলি মুছুন ...
              x1d d 1 এর সমস্ত সূচী d।
    s ~ সমতল।
   s ~ Sum [] উপস্থিত না হলে আমি ব্যবহার করতে পারতাম।
  y ~ দ্বিগুণ।
x the উপরের ম্যাপিংয়ে, এর প্রথম সূচক পান ...
                       ss the ইনপুট ম্যাট্রিক্সে মোট 1 এর সংখ্যা।

এটি প্রতিশ্রুতি d315e19 এ কাজ করে , টিওর বর্তমান পাইথ সংস্করণ রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.