আমার গ্রাফ প্ল্যানার?


29

আপনার কাজটি গ্রাফ পরিকল্পনাকারী কিনা তা নির্ধারণ করা।

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

ইনপুট: আপনাকে নিম্নলিখিত ফর্ম্যাটগুলির পছন্দমতো একটি অনির্দেশিত গ্রাফ দেওয়া হবে:

  • প্রান্ত তালিকা, যেমন [(0, 1), (0, 2), (0, 3)]

  • সংলগ্ন মানচিত্র, যেমন {0: [1, 2, 3], 1:[0], 2:[0], 3:[0]}

  • সংলগ্ন ম্যাট্রিক্স, যেমন [[0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

নোডের নাম সংখ্যা, স্ট্রিং বা অনুরূপ হতে পারে তবে আপনার নির্বাচিত ফর্ম্যাটটি একটি স্বেচ্ছাসেবক গ্রাফ সমর্থন করতে সক্ষম হতে হবে। নোড নামগুলিতে কোনও রাখার কোড নেই। কোনও স্ব-লুপ থাকবে না।

এসটিডিআইএন, কমান্ড লাইন আর্গুমেন্ট এবং ফাংশন আর্গুমেন্ট সহ ইনপুটটির স্ট্যান্ডার্ড পছন্দ।

আউটপুট: আপনার সমস্ত প্ল্যানার গ্রাফের জন্য একটি নির্দিষ্ট আউটপুট এবং সমস্ত নন-প্ল্যানার গ্রাফের জন্য আলাদা আলাদা আউটপুট ফিরিয়ে দেওয়া উচিত।

ফাংশন রিটার্ন মান সহ আউটপুটের স্ট্যান্ডার্ড পছন্দ।

উদাহরণ:

প্ল্যানার:

[]
[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6)]
[(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)]
[(0,2), (0,3), (0,4), (0,5), (1,2), (1,3), (1,4), (1,5), (2,3),
 (2,5), (3,4), (4,5)]

Nonplanar:

[(0,1), (0,2), (0,3), (0,4), (1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]
[(0,3), (0,4), (0,5), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5)]
[(0,3), (0,4), (0,6), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5), (5,6), 
 (7,8), (8,9), (7,9)]

স্পষ্টভাবে পরিকল্পনার পরীক্ষা করে বা অন্যথায় নির্দিষ্টভাবে পরিকল্পনাকারী এম্বেডিংগুলি উল্লেখ করে এমন কোনও ক্রিয়াকলাপ অনুমোদিত নয়।

এটি কোড গল্ফ। সংক্ষিপ্ততম কোড জিতুক।


সুন্দর প্রশ্ন!

এটি দুর্দান্ত যে এটি একটি ক্লাসিক সমস্যা এবং এখনও সাধারণ উদ্দেশ্যে ব্যবহার করা হয়নি এমন বেশ কয়েকটি সম্ভাব্য পন্থা রয়েছে।
lirtosiast

একটি প্ল্যানার এবং একটি নন-প্ল্যানার সংযুক্ত উপাদান সহ একটি নন-সংযুক্ত গ্রাফের জন্য একটি পরীক্ষার কেস ভাল হবে।
পিটার টেলর

@ পিটারটেলর অবশ্যই, আমি একটি যুক্ত করব
isaacg

5
@ রেনেইলিডার দুঃখিত, তবে আমি বুঝতে পারি না। ভাসমান পয়েন্ট সংখ্যাগুলির সাথে প্রশ্নের কোনও যোগসূত্র নেই - এটি এমনকি সংখ্যাগুলি ব্যবহার করে না, সত্যই, কেবল লেবেলগুলি।
isaacg

উত্তর:


14

গণিত, 201 বাইট

f@g_:=EdgeCount@g<9||!(h=g~IsomorphicGraphQ~CompleteGraph@#&)@5&&!h@{3,3}&&And@@(f@EdgeDelete[g,#]&&f@EdgeContract[g,#]&/@EdgeList@g);And@@(f@Subgraph[g,#]&/@ConnectedComponents[g=Graph[#<->#2&@@@#]])&

এটি একটি নামবিহীন ক্রিয়াকলাপের জন্য মূল্যায়ন করে যা প্রান্ত তালিকার মতো করে

{{0, 3}, {0, 4}, {0, 5}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}}

এটি ওয়াগনারের উপপাদ্যের উপর ভিত্তি করে একটি মারাত্মকভাবে অক্ষম পুনরাবৃত্তির পদ্ধতি :

একটি সীমাবদ্ধ গ্রাফ প্ল্যানার হয় এবং কেবল যদি এর নাবালক হিসাবে কে 5 বা কে 3,3 না থাকে ।

এখানে, কে 5 হ'ল 5 টি শীর্ষ কোণ সহ সম্পূর্ণ গ্রাফ এবং কে 3,3 প্রতিটি গ্রুপে 3 টি শীর্ষকে সমেত সম্পূর্ণ দ্বিদলীয় গ্রাফ। একটি গ্রাফ গ্রাফ বি এর একটি গৌণ , যদি এটি বি থেকে প্রান্ত মুছে ফেলা এবং প্রান্ত সংকোচনের ক্রম দ্বারা প্রাপ্ত করা যায় ।

সুতরাং এই কোডটি কেবল গ্রাফটি কে 5 বা কে 3,3 তে বিচ্ছিন্ন কিনা তা যাচাই করে এবং যদি তা না হয় তবে এটি প্রতিটি সম্ভাব্য প্রান্ত মোছা বা সংকোচনের জন্য পুনরাবৃত্তভাবে নিজেকে কল করে।

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

প্রদত্ত ইনপুটগুলির জন্য এটি খুব দ্রুত কাজ করে তবে আপনি আরও কয়েকটি কিনারা যুক্ত করলে এটি তাত্ক্ষণিকভাবে দীর্ঘ সময় নিতে পারে (এবং পাশাপাশি প্রচুর স্মৃতিও গ্রহণ করবে)।

এখানে একটি ইনডেন্ট করা সংস্করণ f(নামহীন ফাংশন আসার পরে এটি কেবল ইনপুট থেকে একটি গ্রাফ অবজেক্ট উত্পন্ন করবে:

f@g_ := 
  EdgeCount@g < 9 || 
  ! (h = g~IsomorphicGraphQ~CompleteGraph@# &)@5 && 
  ! h@{3, 3} &&
  And @@ (f@EdgeDelete[g, #] && f@EdgeContract[g, #] & /@ EdgeList@g)

এবং এটি নামবিহীন ফাংশন যা ইনপুটটিকে গ্রাফে রূপান্তর করে এবং fপ্রতিটি সংযুক্ত উপাদানকে কল করে :

And @@ (
  f @ Subgraph[g, #] & /@ ConnectedComponents[
    g=Graph[# <-> #2 & @@@ #]
  ]
)&

আমি থেকে অবসান অবস্থায় পরিবর্তন করে বাইট দুয়েক সংরক্ষণ করতে পারবেন EdgeCount@g<9করার g==Graph@{}, কিন্তু যে উল্লেখযোগ্যভাবে রানটাইম উড়িয়ে হবে। দ্বিতীয় পরীক্ষার ক্ষেত্রে 30 সেকেন্ড সময় লাগে এবং শেষটি এখনও শেষ করেনি।


আপনি চেষ্টা করতে পারেন এবং নামকৃত ফাংশনটি সরিয়ে ফেলতে পারেন #0যা অভ্যন্তরীণ খাঁটি ফাংশনটিকে বোঝায়।
লেজিয়ানম্মাল978

@ LegionMammal978 আমি জানি, তবে এটি সত্যিকার অর্থে কিছুই সংরক্ষণ করে না, কারণ তখন আমার প্রথম বন্ধনী প্রয়োজন এবং ম্যানুয়ালি #একটি পরিবর্তনশীলকেও বরাদ্দ করতে হবে g
মার্টিন ইন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.