একটি বিভাজক গ্রাফের সবচেয়ে ছোট পাথ


15

ভূমিকা

এই চ্যালেঞ্জের মধ্যে আমরা একটি নির্দিষ্ট অসীম পুনর্নির্দেশিত গ্রাফ নিয়ে কাজ করব, যা আমি উচ্চ বিভাজক গ্রাফ বলি । তার নোড 2. থেকে শুরু দুই নোড মধ্যে একটি প্রান্ত নেই পূর্ণসংখ্যা একটি <b যদি একটি ভাগ এবং একটি 2 ≥ খ । 2 থেকে 18 এর মধ্যে রেঞ্জ দ্বারা গঠিত উপগ্রাফটি এমন দেখাচ্ছে:

16-8 12 18
  \|/ |/|
   4  6 9 10 15 14
   |  |/   |/   |
   2  3    5    7  11 13 17

এটি দেখানো যেতে পারে যে অসীম উচ্চ ডিভাইডার গ্রাফটি সংযুক্ত আছে, তাই আমরা দুটি নোডের মধ্যে সংক্ষিপ্ততম পথ সম্পর্কে জিজ্ঞাসা করতে পারি।

ইনপুট এবং আউটপুট

আপনার ইনপুট দুটি পূর্ণসংখ্যা এবং । আপনি ধরে নিতে পারেন যে 2 ≤ a ≤ b <1000 । আপনার আউটপুট হ'ল a এবং b এর মধ্যে সংক্ষিপ্ততম দৈর্ঘ্যের দৈর্ঘ্য অসীম উচ্চ ডিভোজার গ্রাফের মধ্যে । এর অর্থ পথের প্রান্তগুলির সংখ্যা।

আপনি নিম্নলিখিত আসলে দরকারী এটি করতে পারেন: সবসময় থেকে একটি অনুকূল পথ বিদ্যমান একটি থেকে যে প্রথম বৃদ্ধি এবং তারপর কমে, এবং শুধুমাত্র ভিজিট নোড যে কঠোরভাবে কম 2b 2 । বিশেষত, বি <1000 থেকে আপনাকে কেবল নোডগুলি 2 000 000 এর চেয়ে কম বিবেচনা করতে হবে।

উদাহরণ

ইনপুট 3এবং বিবেচনা করুন 32। নোড 3 এবং 32 এর মধ্যে একটি সম্ভাব্য পাথ

3 -- 6 -- 12 -- 96 -- 32

এই পাথের চারটি কিনারা রয়েছে এবং এটি দেখা যায় যে কোনও ছোট পথ নেই, সুতরাং সঠিক আউটপুট 4

অন্য একটি উদাহরণ হিসাবে, জন্য একটি অনুকূল পথ 2এবং 25হয়

2 -- 4 -- 8 -- 40 -- 200 -- 25

সুতরাং সঠিক আউটপুট হয় 5। এই ক্ষেত্রে, কোনও অনুকূল পথে নোড থাকে না 50 = lcm(2, 25)

বিধি এবং স্কোরিং

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

পরীক্ষার মামলা

2 2 -> 0
2 3 -> 4
2 4 -> 1
2 5 -> 5
3 5 -> 4
6 8 -> 2
8 16 -> 1
12 16 -> 2
16 16 -> 0
2 25 -> 5
3 32 -> 4
2 256 -> 3
60 77 -> 3
56 155 -> 3
339 540 -> 2
6 966 -> 4
7 966 -> 2
11 966 -> 4
2 997 -> 7
991 997 -> 4

আমার ধারণা আছে যা নিষ্ঠুরূপে নয়, যেমনটি আমি ধরে নিয়েছি, এটি দুটি সংখ্যার ক্ষুদ্রতম একককে গণনা করে, শক্তি দুটি দ্বারা উপস্থিত না হওয়া পর্যন্ত ধীরে ধীরে গুন করে, তারপর দ্বিতীয় সংখ্যাটি উপস্থিত না হওয়া পর্যন্ত ধীরে ধীরে স্কয়ার্ট দিয়ে বিভাজন করে, আমার কোনও সময় নেই iy এখন
ঘটনাক্রমে

জাগার্ব, গণিত কি FindShortestPath স্ট্যান্ডার্ড লুফোলগুলি সম্পর্কে বাধা লঙ্ঘন করে? যদি এটি হয় তবে কেবল আমাকে জানান এবং আমি আমার জমাটি মুছব।
ডেভিডসি

@ ডেভিডসিকে আমি এটিকে একটি ফাঁক হিসাবে বিবেচনা করি না। প্রাসঙ্গিক উত্তর আসলে এর 0. একটি স্কোর হয়েছে
Zgarb

উত্তর:


4

মতলব, 218 190 175 বাইট

function f(a,b);q=a;l(b)=0;l(a)=1;while~l(b);x=q(1);q=q(2:end);l(end+1:x^2)=0;g=x+1:x^2;s=2:x-1;u=[g(~mod(g,x)),s(~mod(x,s)&s.^2>=x)];u=u(~l(u));q=[q,u];l(u)=l(x)+1;end;l(b)-1

তালিকাটি দীর্ঘায়িত করার পদক্ষেপে শর্টকাটের জন্য @ বেকারকে ধন্যবাদ!

এটি তুলনামূলকভাবে সোজাসাপ্টা ডিজজস্ট্রার বাস্তবায়ন:

q=a;                  %queue
l(b)=0;       %list of path lengths
l(a)=1;
while~l(b);         %if there is no predecessor to b
    x=q(1);         %get first queue element
    q=q(2:end);
    %add edges 
    l(end+1:x^2)=0;% lengthen predecessor list if too short
    g=x+1:x^2;      % g=greater neighbours
    s=2:x-1;        % s=smaller neighbours %keep only valid/unvisited neighbours 
    u=[g(~mod(g,x)),s(~mod(x,s)&s.^2>=x)]; %-1byte
    u=u(~l(u));
    q=[q,u];      %add only hte valid nodes edges to queue
    l(u)=l(x)+1;       %mark x as predecessor  
end;
l(b)-1 %output length to the end of the path

আজ কোন সমঝোতা


2
পরিবর্তে l=zeros(1,a*b);আপনি ব্যবহার করতে পারেন l(a*b)=0;, যা একই কাজ করে
লুইস মেন্ডো

হায় .... এখনও 10 বাইট আপনার পিছনে।
Abr001am

1

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

(m,n)=>(g=i=>{for(q=[i],r=[],r[i]=j=0;i=q[j++];)for(k=i+i;k<=i*i&(k<m*m*2|k<n*n*2);k+=i)r[k]-r[i]<2?0:r[q.push(k),k]=r[i]+1},g(m),s=r,g(n),Math.min(...r.map((i,j)=>i+s[j]).filter(i=>i)))

প্রদত্ত সীমা gথেকে সমস্ত ক্রমবর্ধমান পাথ গণনা করতে একটি সহায়ক ফাংশন ব্যবহার করে mএবং nতারপরে পাথগুলিকে একসাথে যোগ করে সর্বনিম্ন মান প্রদান করে।


1

গণিত 98 98 বাইট

আমি ধরে নিচ্ছি যে বিল্ট-ইন ফাংশনটি FindShortestPathস্ট্যান্ডার্ড লুফোলগুলি সম্পর্কে সীমাবদ্ধতা লঙ্ঘন করে না। যদি এটি হয় তবে কেবল আমাকে জানান এবং আমি এই জমাটি মুছব।

ব্রুট ফোর্স, সুতরাং এর বৃহত মানগুলির সাথে ধীর b। আমি এখনও এটির গতি বাড়ানোর উপায়গুলি নিয়ে ভাবছি।

h@{a_,b_}:=Length@FindShortestPath[Graph[Apply[Join,Thread[#<->Range[2,#] #]&/@Range[b^2]]],a,b]-1

এটি থেকে নোডগুলির মধ্যে যথাযথ প্রান্ত সহ একটি গ্রাফ সেট আপ aকরে b^2FindShortestPathগ্রাফের সবচেয়ে সংক্ষিপ্ততম পথটি খুঁজে পায়। Lengthনোডগুলি গণনা করে; Length -1প্রান্ত সংখ্যা।

Thread[# <-> Range[2, #] #] &পূর্ণ গ্রাফ এর প্রান্ত উত্পাদন করে। উদাহরণস্বরূপ, Thread[# <-> Range[2, #] #]&[5]প্রান্ত উত্পাদন করবে {5 <-> 2*5, 5 <-> 3*5, 5 <-> 4*5, 5 <-> 5*5}, যে {5 <-> 10, 5 <-> 15, 5 <-> 20, 5 <-> 25},।


1

মতলব (195) (185) (181) (179)(173)

দ্রষ্টব্য: আমাকে ব্যবহারকারী Agawa001 ব্যক্তিগতভাবে আমি প্রমাণিত করেছি যে আমি ব্যবহারকারী @ ফ্লোর তার সহায়তা ব্যবহার করে জিতেছি

 function t(a,b,p),for r=0:1,d=(b*~r+r*a)/gcd(a,b);while(d>1)p=p+1;e=find(~rem(d,1:d));f=max(e(a^(1-r/2)>=e));a=a*min([find(1:a*a>=b) a])^~(f-1);d=d/f;a=a*f^(1-2*r);end,end,p
  • এই ফাংশনটি অন্যদের মধ্যে আলাদা আলাদা, এটি খাঁটি গাণিতিক গণনা এবং কারণগুলি অনুসরণ করে তবে পাথ বা গ্রাফের সাথে কিছুই করার নেই।
  • ফাংশন কল উদাহরণ:

     t(2,3,0)
    
     p =
    
     4
    

    সমস্ত পরীক্ষার কেস সন্তুষ্ট

  • ব্যাখ্যা:

ব্যাখ্যা দিয়ে শুরু করার আগে কিছু লেমাসকে "সবুজ নয়" প্রমাণ করতে দিন:

লেমা (১): যে কোনও দুটি সংখ্যার মধ্যে একটি অনুকূল পথ (a,b)এমনভাবে বিদ্যমান যার ফলে নোডগুলি প্রথমে বাড়ছে তারপরে হ্রাস পাচ্ছে।

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

লেমা (২): একটি সংখ্যার aথেকে b, যদি gcd(a,b)=1 aএটি দ্বারা গুণিত হয় b, যদি এটির bচেয়ে বড় হয় তবে aএটি একটি পরিচিত সংখ্যার দ্বারা গুণিত হয় c, যদি নামটির gcd>1 aবৃহত্তম বিভাজক দ্বারা ধীরে ধীরে গুণিত করা আবশ্যক তবে শর্তটিও যাচাই করে যখন সমস্ত নাম হয় সর্বনিম্ন চেয়ে বড় হয় , আবার গ্রহণ করে।b/gcdda >= ddaaa*c

এই অনুমান করা সহজ যে কোনও প্রারম্ভিক নোডের aক্ষুদ্রতম এককটি না পৌঁছানো অবধি তার গুণন করা আবশ্যক aএবং bতাই হয় আমরা b*gcdশুরুর অনুপাত দ্বারা গুন করি যা মূল শর্তটি যাচাই করে, যা বিভাজন প্রক্রিয়া শুরুর আগে সর্বদা সংক্ষিপ্ত পথে গ্যারান্টি দেয়, বা যখন dপাওয়া যায় না তখন এই প্রথম পর্যায়ে একটি বৈধ শর্ত তৈরি করতে একটি সংখ্যা cদ্বারা গুণিত হয় ।aa>=d

থিম (3): গ্রাফ-ultimum একাধিক থেকে aথেকে b, এই সংখ্যা GCD এবং bহয় bনিজেই

ঠিক এটি পূর্বের হেরফেরগুলির একটি পরিণতি মাত্র এবং শেষ বাকী ধাপগুলি ধীরে ধীরে বৃহত্তম বিভাজক দ্বারা ভাগ করা হয় যা এর বর্গমূল ছাড়িয়ে যায় না।

দ্বিধা: সর্বোত্তম সংখ্যাটি কী cদ্বারা পুনরাবৃত্তভাবে গুণিত করা যায় aযা প্রথম পর্যায়ে প্রথমটির জন্য খোলার শর্তে সোজা হয়ে যাবে তখন আলটিমাম?

ভাল প্রশ্ন, যে কোনও সাধারণ পরিস্থিতির জন্য একটি সরল প্যারী রয়েছে, সুতরাং দুটি প্রান্তের উদাহরণটিকে ধরে রেখে (a,b)=(4,26)এটির মতো গুণিত করা:

  2 | 2
  2 | 13

gcd=2ক্ষুদ্রতম পূর্ণসংখ্যা ছাড়াও যেটি 2পৌঁছাতে হবে 13তার দ্বারা গুণন করতে হবে 7তবে এটি অবশ্যই অস্বীকার করা হয়েছে যে এটি 2 এর চেয়ে বড়, সুতরাং একটি বর্গক্ষেত্রযুক্ত।

  2 | 2 
  5 | 13

(a,b)=(10,26)উপরের দ্বিতীয় উদাহরণে উপস্থিতি cসর্বনিম্ন পূর্ণসংখ্যার হিসাবে পরিমাপ করা 1হয় 5যা থেকে অতিক্রম করে 13/5তাই এটি গ্রাফ-স্কেলিংয়ের শর্তটি সন্তুষ্ট করে, যা এখানে 3, তাই পরবর্তী পদক্ষেপটি এখানে গুণ করে চলেছে3

  2 | 2 
  5 | 13
  3 |

কেন? এটি কারণ, একবার যখন আমাদের 2*13/gcd=13টেবিলের দ্বিতীয় দিকটি মিলিয়ে গুন করতে হয় , তখন আমরা পূর্বে যোগ করা জাঙ্ক পরিমাণটি সর্বোত্তমতম এবং গ্রাফটি ধরে রেখে ন্যূনতম করা হয়, যদি কখনও আমরা 10বিভাজনের সম্ভাবনার মতো বৃহত্তর মান দ্বারা গুণিত হয় if সর্বনিম্ন সময় হ্রাস পায় এবং এটি আমাদের লক্ষ্যে পৌঁছানোর জন্য আরও 1 বিভাজক পদক্ষেপ দ্বারা বাড়ানো হত 2*13। যা গণনা করা হয়: 13*2*5*10/2*5তারপর 13*2*5/5। যদিও, স্পষ্টতই এখানে সংখ্যা দ্বারা বিভক্ত করা হয়5*3<13*2

এবং আরও একটি জিনিস ........ হ্যাঁ ম্যাথ ...


এগুলি আমার সাথে তুলনামূলক ফলাফলগুলি ফ্লোয়ারের সাথে কেবলমাত্র মনোযোগ দেয় যে আমি ফ্লুয়ারের অ্যালগরিদম সংরক্ষণের সময় নির্বাহের জন্য একটি উচ্চতর বাউন্ড তৈরি করেছিলাম, এতে খুব বেশি সময় লাগে!

আপনি অনলাইনে সংকলনযোগ্য কোডের শিরোনামে ভেরিয়েবল a এবং b হিসাবে শুরু এবং শেষ স্ক্যানিং রেঞ্জগুলি সন্নিবেশ করতে পারেন।


বাহ, এটা অবাক। আমি আশা করিনি যে সোজা উপায়ে অনুকূল পথগুলি নির্মিত হতে পারে। ব্যাখ্যার অপেক্ষায় ...
জাগারব

@ জাগারব আমি মূল পোস্টের মন্তব্যের মধ্যে একটি তুচ্ছ ব্যাখ্যা করেছি, আমি যখন গল্ফিং শেষ করব, তখন বিটিডব্লিউ, কী এক অনন্য সুন্দর চ্যালেঞ্জ!
Abr001am

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