अंतिम खड़े - ज़ोंबी गिरोह हार


25

परिचय

आप एक द्वीप पर अकेले हैं। मानवता का शेष मर चुका है ( शायद user12345 के कोड में बग के कारण )। ज़ोंबी पाइरेट होर्डे आपके द्वीप तक पहुंच गया है, और वे अंतहीन हैं। यह समय है गधे को लात मारने या बबल गम चबाने का, और तुम सब बबल गम से बाहर हो।

संकट

हमारे प्रलय का दिन एक ही पंक्ति में 2 पूर्णांकों द्वारा वर्णित है, mऔर n। आपके द्वीप पर 1 से लेकर तक की विशिष्ट संख्या वाली चौकी हैं m। निम्नलिखित nलाइनों प्रत्येक तीन पूर्णांकों, शामिल x, y, और z, एक रिक्ति से अलग कर दिया। xऔर yदो चौकी की अनूठी आईडी हैं, और zउन दोनों के बीच रास्ते पर आने वाली लाशों की संख्या है।

जब आप एक पथ यात्रा करते हैं, तो आप zगोला बारूद खो देते हैं और आप zलाश को मारते हैं। यदि आप फिर से उसी रास्ते पर जाते हैं, तो आप दुर्भाग्य से उसी संख्या में लाश का सामना करेंगे। हर बार जब आप किसी पथ पर जाते हैं, तो सभी चौकी +1 बारूद उत्पन्न करते हैं। आप चौकी पर 100 गोला बारूद के साथ शुरू करते हैं। सभी चौकी 0 गोला बारूद के साथ शुरू होते हैं। आप तुरंत मर जाते हैं यदि कोई रास्ता मौजूद नहीं है जिसके लिए आपका गोला बारूद उस रास्ते पर लाश की संख्या से अधिक है, और आपके गोला-बारूद के शेष भाग को मार दिया जाता है। ऐसा आपका अंतिम स्टैंड है।

एक प्रोग्राम लिखें जो किसी दिए गए परिदृश्य के लिए आपको मार सकने वाली अधिकतम संख्या में लाशें उत्पन्न करता हो। यदि आप एक अनंत संख्या में लाश को मार सकते हैं, तो बस उत्पादन करें x

उदाहरण इनपुट

5 6
1 2 4
2 3 4
3 1 4
2 4 10
2 5 10
1 1 50

उदाहरण आउटपुट

x

मान्यताओं

  • एक रास्ता दो वैध चौकी के बीच होगा। यह कहना है 1 <= x/ y<=m
  • के बीच एक रास्ता तो xऔर yसूचीबद्ध नहीं है, यह कूच नहीं किया जा सकता
  • एक रास्ता द्विदिश है
  • 1 << m= 100
  • 1 << n= 500
  • इनपुट स्टड के माध्यम से प्रदान किया जाना चाहिए, एक फ़ाइल से पढ़ा जाता है, या प्रोग्राम के एकमात्र तर्क के रूप में स्वीकार किया जाता है, और इसे बिल्कुल उदाहरण के प्रारूप का पालन करना चाहिए
  • आपके कार्यक्रम का रनटाइम मनमाने ढंग से बड़ा हो सकता है, लेकिन निश्चित रूप से परिमित होना चाहिए

सबसे कम वर्णों वाला कोड जीतता है!


क्या प्रत्येक चौकी 10 बारूद के साथ शुरू होने के अलावा अन्य है ? क्या ग्राफ अप्रत्यक्ष है?
पीटर टेलर

2
यह शायद एक निश्चित मामले में एक निश्चित श्रेणी के कीड़े के पूर्व-खाली करने के लिए उपयोगी होगा जिसमें एक चक्र होता है जो आपके बारूद को नीचे नहीं चलाता है लेकिन जो समय पर नहीं पहुंच सकता है। (मुझे यह जोड़ना चाहिए कि मुझे यकीन नहीं है कि वर्तमान परीक्षण मामला सही है: मुझे ऐसा लगता है कि चक्र की 1->1कीमत 49 बारूद है, और चक्र की 1->2->3->1लागत लंबे समय में 3 बार होती है।
पीटर टेलर

@PeterTaylor मुझे अपनी दोनों टिप्पणियों को वापस लेना पड़ा क्योंकि ऐसा प्रतीत होता है कि मैंने उदाहरण को द्विदिश बना दिया । इसलिए मुझे शुरू करने की अनुमति दें - सभी रास्ते द्विदिश हैं और सभी चौकी 0. से शुरू होती हैं। उदाहरण अब काम करना चाहिए।
रेनबोलेट

@Rusher: अच्छा उदाहरण! मुझे खुद को दिखाने के लिए 45 कदम उठाए कि यह वास्तव में अनंत है। क्या हम यह मान सकते हैं कि सभी चौकी फिर से उपलब्ध होंगी या क्या आप चाहते हैं कि हम उस मामले को संभालें जहां मुख्य ग्राफ से अलग किए गए चौकी हैं?
Claudiu

1
आह ... तो ए से बी तक के प्रत्येक चरण के लिए, प्रत्येक चौकी एक बारूद "उत्पन्न" करती है और जब तक आप इसे नहीं लेते, तब तक इसे वहां रखा जाता है।
टोबिया

जवाबों:


14

जावा ( कम अंतराल: 8415 5291 3301)

ठीक है। मूल रूप से, मैं शर्मिंदा हूं कि किसी ने भी समाधान प्रस्तुत नहीं किया है। इसलिए कुछ दिनों पहले मैंने इस समस्या को हल करने की कोशिश शुरू की, b / c यह बहुत अच्छा है। । GitHub के माध्यम से उस पर मेरी प्रगति देखने के लिए उस लिंक का अनुसरण करें।

संपादित करें

नया सॉल्वर वर्जन, बहुत अधिक "गोल्फ", सही चक्र चेकर के साथ MT0 द्वारा पहचाना गया। यह वीएम को कितनी मेमोरी उपलब्ध है, यह बदलकर फास्ट-फॉरवर्डिंग मार्गों का समर्थन करता है। नवीनतम बिग संपादित: एहसास हुआ कि मेरे पास कुछ अन्य छोटे सूचकांक त्रुटियां और समय से पहले अनुकूलन थे, जिसके परिणामस्वरूप काफी बड़ी संख्या में जीत पर विचार करने में विफलता हुई। तो यह तय है, ध्यान से। नया संस्करण छोटा और नीचे दोनों है। हमारे संदर्भ मार्ग के लिए, java -Xmx2GB ZombieHordeMinचाल काफी अच्छी तरह से है (चेतावनी दी जा सकती है, इसमें थोड़ा समय लगेगा)।

कूल फैक्टॉयड

एक आकर्षक मोड़ में, 24 साल की लंबाई में MANY समाधान हैं, और मेरा सॉल्वर MT0 से एक अलग पाता है, लेकिन सिद्धांत रूप में समान है, सिवाय इसके कि इससे जुड़े अन्य चौकी पर जाकर शुरू होता है 1। चित्त आकर्षण करनेवाला! पूरी तरह से मानव अंतर्ज्ञान का मुकाबला, लेकिन पूरी तरह से वैध।

समाधान हाइलाइट्स

तो यहाँ मेरा है। यह (आंशिक रूप से) गोल्फ, बी / सी यह एक घातीय, लगभग-ब्रूट-बल सॉल्वर है। मैं एक IDDFS का उपयोग करता हूं (पुनरावृत्ति गहनता पहले खोज) एल्गोरिथ्म, इसलिए यह एक महान सामान्य सॉल्वर है जो स्किप नहीं करता है, इसलिए यह ओपी के प्रश्न के दोनों भागों को हल करता है , अर्थात्:

  • यदि एक विजेता मार्ग पाया जाता है (अनंत लाश), आउटपुट 'x'।
  • यदि सभी मार्ग मृत्यु (परिमित लाश) के रूप में समाप्त हो जाते हैं, तो सबसे बड़ी संख्या में मारे गए लाश का उत्पादन होता है।

इसे पर्याप्त शक्ति, स्मृति और समय दें, और यह धीमी गति से मृत्यु के नक्शे को भी ठीक करेगा। मैंने इस सॉल्वर को बेहतर बनाने के लिए कुछ और समय बिताया, और जबकि अधिक किया जा सकता है, अब यह थोड़ा बेहतर है। मैंने सर्वश्रेष्ठ अनंत-लाश ​​समाधान पर MT0 की सलाह को भी एकीकृत किया, और अपने विजेता-चेकर से कई समयपूर्व अनुकूलन को हटा दिया, जिसने पिछले संस्करण को इसे खोजने से रोक दिया था, और अब मैं वास्तव में वर्णित MT0 के समान एक बहुत ही समान समाधान ढूंढता हूं।

कुछ अन्य हाइलाइट्स:

  • जैसा कि उल्लेख किया गया है, सबसे कम संभव जीतने वाले मार्ग को खोजने के लिए एक IDDFS का उपयोग करता है।
  • चूंकि यह एक डीएफएस कोर में है, इसलिए यह भी पता चलेगा कि क्या हर मार्ग हमारे नायक की मृत्यु में समाप्त होता है, और मारे गए अधिकांश लाशों के संदर्भ में "सर्वश्रेष्ठ" मार्ग का ट्रैक रखता है। एक हीरो मरो!
  • मैंने गोल्फ को हटाने के उद्देश्य से इसे देखने के लिए इसे और अधिक रोचक बनाने के लिए एल्गोरिदम का उपयोग किया है। अनथक संस्करण को देखने के लिए गीथब के लिंक में से एक का पालन करें।
  • साथ ही साथ कई टिप्पणियाँ हैं, इसलिए अपने दृष्टिकोण पर अपने स्वयं के समाधान के निर्माण के लिए फिर से लागू करने के लिए स्वतंत्र महसूस करें, या मुझे दिखाएं कि यह कैसे किया जाना चाहिए!
  • मेमोरी-अनुकूली मार्ग तेजी से अग्रेषण
    • उपलब्ध सिस्टम मेमोरी तक, "अंत मार्गों" का ट्रैक रखेगा, जिसके परिणामस्वरूप मृत्यु नहीं हुई।
    • एक फैंसी रूट कम्प्रेशन और डीकम्प्रेशन रुटीन का उपयोग करते हुए, IDDFS की एक पूर्व पुनरावृत्ति से प्रगति को पुनर्निमित किया जाता है ताकि सभी आने वाले मार्गों को पुनर्परिभाषित किया जा सके।
    • एक जानबूझकर साइड-बोनस के रूप में, मृत-अंत मार्ग के रूप में कार्य करता है। मृत अंत मार्गों को संग्रहीत नहीं किया जाता है, और IDDFS के भविष्य की गहराई में फिर से कभी नहीं जाएंगे।

सॉल्वर का इतिहास

  • मैंने वन-स्टेप लुक-फ़ॉरवर्ड एल्गोरिदम का एक गुच्छा आज़माया, और बहुत ही सरल परिदृश्यों के लिए वे काम करेंगे, अंततः वे सपाट हो जाते हैं।
  • फिर मैंने दो-चरणीय लुक-फॉर-अल्गोरिथम की कोशिश की, जो कि .. असंतोषजनक था।
  • मैंने तब एक एन-स्टेप लुकहेड का निर्माण शुरू किया, जब मैंने पहचाना कि यह दृष्टिकोण डीएफएस के लिए अतिरेक है, फिर भी डीएफएस बहुत दूर है ... अधिक सुरुचिपूर्ण।
  • डीएफएस का निर्माण करते समय, मेरे साथ यह हुआ कि आईडीडीएफएस (ए) सबसे अच्छा हीरो (मृत्यु) मार्ग या (बी) प्रथम विजेता चक्र सुनिश्चित करेगा।
  • एक जीत-चक्र चेकर का निर्माण करना आसान है, लेकिन एक सफल सफल चेकर के पास जाने से पहले मुझे कई बहुत गलत पुनरावृत्तियों से गुजरना पड़ा।
  • MT0 के जीत-पथ में फैले समयपूर्व अनुकूलन की तीन पंक्तियों को हटाने के लिए जिसने मेरे एल्गोरिथ्म को इसके लिए अंधा बना दिया।
  • एक अनुकूली मार्ग-कैशिंग एल्गोरिथ्म जोड़ा गया है जो आईडीडीएफएस कॉल के बीच काम के अनावश्यक पुनर्विकास को रोकने के लिए आपके द्वारा दी गई सभी मेमोरी का उपयोग करेगा, और स्मृति की सीमा तक मृत-अंत मार्गों को भी बंद कर देगा।

(गोल्फ) कोड

कोड पर ( यहाँ या यहाँ ungolfed संस्करण प्राप्त करें ):

import java.util.*;public class ZombieHordeMin{int a=100,b,m,n,i,j,z,y,D=0,R,Z,N;int p[][][];Scanner in;Runtime rt;int[][]r;int pp;int dd;int[][]bdr;int ww;int[][]bwr;int[][]faf;int ff;boolean ffOn;public static void main(String[]a){(new ZombieHordeMin()).pR();}ZombieHordeMin(){in=new Scanner(System.in);rt=Runtime.getRuntime();m=in.nextInt();N=in.nextInt();p=new int[m+1][m+1][N+1];int[]o=new int[m+1];for(b=0;b<N;b++){i=in.nextInt();j=in.nextInt();z=in.nextInt();o[i]++;o[j]++;D=(o[i]>D?o[i]:D);p[i][j][++p[i][j][0]]=z;if(i!=j)p[j][i][++p[j][i][0]]=z;D=(o[j]>D?o[j]:D);}m++;}void pR(){r=new int[5000][m+3];r[0][0]=a;Arrays.fill(r[0],1,m,1);r[0][m]=1;r[0][m+1]=0;r[0][m+2]=0;ww=-1;pp=dd=0;pR(5000);}void pR(int aMD){faf=new int[D][];ff=0;ffOn=true;for(int mD=1;mD<=aMD;mD++){System.out.printf("Checking len %d\n",mD);int k=ffR(0,mD);if(ww>-1){System.out.printf("%d x\n",ww+1);for(int win=0;win<=ww;win++)System.out.printf(" %d:%d,%d-%d",win,bwr[win][0],bwr[win][1],bwr[win][2]);System.out.println();break;}if(k>0){System.out.printf("dead max %d kills, %d steps\n",pp,dd+1);for(int die=0;die<=dd;die++)System.out.printf(" %d:%d,%d-%d",die,bdr[die][0],bdr[die][1],bdr[die][2]);System.out.println();break;}}}int ffR(int dP,int mD){if(ff==0)return pR(dP,mD);int kk=0;int fm=ff;if(ffOn&&D*fm>rt.maxMemory()/(faf[0][0]*8+12))ffOn=false;int[][]fmv=faf;if(ffOn){faf=new int[D*fm][];ff=0;}for(int df=0;df<fm;df++){dS(fmv[df]);kk+=pR(fmv[df][0],mD);}fmv=null;rt.gc();return kk==fm?1:0;}int pR(int dP,int mD){if(dP==mD)return 0;int rT=0;int dC=0;int src=r[dP][m];int sa=r[dP][0];for(int dt=1;dt<m;dt++){for(int rut=1;rut<=p[src][dt][0];rut++){rT++;r[dP+1][0]=sa-p[src][dt][rut]+r[dP][dt];for(int cp=1;cp<m;cp++)r[dP+1][cp]=(dt==cp?1:r[dP][cp]+1);r[dP+1][m]=dt;r[dP+1][m+1]=rut;r[dP+1][m+2]=r[dP][m+2]+p[src][dt][rut];if(sa-p[src][dt][rut]<1){dC++;if(pp<r[dP][m+2]+sa){pp=r[dP][m+2]+sa;dd=dP+1;bdr=new int[dP+2][3];for(int cp=0;cp<=dP+1;cp++){bdr[cp][0]=r[cp][m];bdr[cp][1]=r[cp][m+1];bdr[cp][2]=r[cp][0];}}}else{for(int chk=0;chk<=dP;chk++){if(r[chk][m]==dt){int fR=chk+1;for(int cM=0;cM<m+3;cM++)r[dP+2][cM]=r[dP+1][cM];for(;fR<=dP+1;fR++){r[dP+2][0]=r[dP+2][0]-p[r[dP+2][m]][r[fR][m]][r[fR][m+1]]+r[dP+2][r[fR][m]];for(int cp=1;cp<m;cp++)r[dP+2][cp]=(r[fR][m]==cp?1:r[dP+2][cp]+1);r[dP+2][m+2]=r[dP+2][m+2]+p[r[dP+2][m]][r[fR][m]][r[fR][m+1]];r[dP+2][m]=r[fR][m];r[dP+2][m+1]=r[fR][m+1];}if(fR==dP+2&&r[dP+2][0]>=r[dP+1][0]){ww=dP+1;bwr=new int[dP+2][3];for(int cp=0;cp<dP+2;cp++){bwr[cp][0]=r[cp][m];bwr[cp][1]=r[cp][m+1];bwr[cp][2]=r[cp][0];}return 0;}}}dC+=pR(dP+1,mD);if(ww>-1)return 0;}for(int cp=0;cp<m+3;cp++)r[dP+1][cp]=0;}}if(rT==dC)return 1;else{if(ffOn&&dP==mD-1)faf[ff++]=cP(dP);return 0;}}int[]cP(int dP){int[]cmp=new int[dP*2+3];cmp[0]=dP;cmp[dP*2+1]=r[dP][0];cmp[dP*2+2]=r[dP][m+2];for(int zip=1;zip<=dP;zip++){cmp[zip]=r[zip][m];cmp[dP+zip]=r[zip][m+1];}return cmp;}void dS(int[]cmp){int[]lv=new int[m];int dP=cmp[0];r[dP][0]=cmp[dP*2+1];r[dP][m+2]=cmp[dP*2+2];r[0][0]=100;r[0][m]=1;for(int dp=1;dp<=dP;dp++){r[dp][m]=cmp[dp];r[dp][m+1]=cmp[dP+dp];r[dp-1][cmp[dp]]=dp-lv[cmp[dp]];r[dp][m+2]=r[dp-1][m+2]+p[r[dp-1][m]][cmp[dp]][cmp[dP+dp]];r[dp][0]=r[dp-1][0]+r[dp-1][cmp[dp]]-p[r[dp-1][m]][cmp[dp]][cmp[dP+dp]];lv[cmp[dp]]=dp;}for(int am=1;am<m;am++)r[dP][am]=(am==cmp[dP]?1:dP-lv[am]+1);}}

मेरे द्वारा किए गए किसी भी परिवर्तन को ट्रैक करने के लिए, यहाँ github से कोड प्राप्त करें । यहाँ कुछ अन्य मानचित्र हैं जिनका मैंने उपयोग किया है।

आउटपुट उदाहरण

संदर्भ समाधान के लिए उदाहरण आउटपुट:

    $ java -d64 -Xmx3G ZombieHordeMin > reference_route_corrected_min.out
    5 6 1 2 4 2 3 4 3 1 4 2 4 10 2 5 10 1 1 50
    Checking len 1
    Checking len 2
    Checking len 3
    Checking len 4
    Checking len 5
    Checking len 6
    Checking len 7
    Checking len 8
    Checking len 9
    Checking len 10
    Checking len 11
    Checking len 12
    Checking len 13
    Checking len 14
    Checking len 15
    Checking len 16
    Checking len 17
    Checking len 18
    Checking len 19
    Checking len 20
    Checking len 21
    Checking len 22
    Checking len 23
    Checking len 24
    25 x
     0:1,0-100 1:3,1-97 2:1,1-95 3:2,1-94 4:5,1-88 5:2,1-80 6:4,1-76 7:2,1-68 8:1,1-70 9:2,1-68 10:1,1-66 11:2,1-64 12:1,1-62 13:2,1-60 14:1,1-58 15:2,1-56 16:1,1-54 17:2,1-52 18:1,1-50 19:2,1-48 20:1,1-46 21:2,1-44 22:1,1-42 23:2,1-40 24:1,1-38

पढ़ें इस तरह मार्ग उत्पादन: step: source, route-to-get-here- ammo। तो उपरोक्त समाधान में, आप इसे इस प्रकार पढ़ेंगे:

  • कदम-कदम पर 0, 1बारूद के साथ चौकी पर 100
  • कदम-कदम पर 1, बारूद को समाप्त 1करने के 3साथ चौकी जाने के लिए मार्ग का उपयोग करें97
  • कदम-कदम पर 2, बारूद को समाप्त 1करने के 1साथ चौकी जाने के लिए मार्ग का उपयोग करें95
  • ...

नोट बंद करना

इसलिए, मुझे आशा है कि मैंने अपने समाधान को हरा देने के लिए कठिन बना दिया है, लेकिन कृपया कोशिश करें! मेरे खिलाफ इसका इस्तेमाल करें, कुछ समानांतर प्रसंस्करण, बेहतर ग्राफ सिद्धांत आदि में जोड़ें। मेरे द्वारा लगाई गई कुछ चीजें इस दृष्टिकोण में सुधार कर सकती हैं :

  • एल्गोरिथ्म की प्रगति के रूप में आक्रामक रूप से कटौती करने के लिए आक्रामक रूप से "कम" छोरों को हटा दें।
    • एक उदाहरण: उदाहरण की समस्या में, छोरों को 1-2-3 और अन्य क्रमपरिवर्तन को "एक कदम" के रूप में समझें, ताकि हम अंत-चक्र को और अधिक तेज़ी से अपना रास्ता बना सकें।
    • उदाहरण के लिए, यदि आप नोड 1 पर हैं, तो आप या तो (a) 2 पर जा सकते हैं, (b) 1 पर जा सकते हैं, (c) 1-2-3 से एक कदम और आगे बढ़ेंगे। यह हल करने के लिए चौड़ाई में गहराई को हल करने की अनुमति देता है, एक विशेष गहराई पर मार्गों की संख्या बढ़ाता है लेकिन लंबे चक्रों के लिए बहुत तेजी से समय-से-समाधान।
  • मृत मार्ग। मेरा वर्तमान समाधान "याद नहीं" करता है कि एक विशेष मार्ग मृत-समाप्त हो गया है, और हर बार इसे फिर से खोज लेना है। बेहतर होगा कि जल्द से जल्द किसी ऐसे पल का ध्यान रखें कि मौत निश्चित है, और इससे आगे कभी नहीं बढ़ सकती। इसे किया...
  • यदि सावधान रहें, तो आप मृत मार्ग को उप-मार्ग के रूप में लागू कर सकते हैं। उदाहरण के लिए, यदि 1-2-3-4 में हमेशा मृत्यु होती है, और सॉल्वर 1-3-1-2-3-4 मार्ग का परीक्षण करने वाला होता है, तो उसे तुरंत उस रास्ते पर उतरना बंद कर देना चाहिए, क्योंकि वह समाप्त होने की गारंटी है। निराशा में। अभी भी कुछ सावधान गणित के साथ, # हत्याओं की गणना करना संभव होगा।
  • कोई अन्य समाधान जो समय के लिए स्मृति को ट्रेड करता है, या मृत-अंत मार्गों का अनुसरण करने से आक्रामक बचने की अनुमति देता है। यह भी किया!

अच्छा जवाब! जब उन्हें समस्या का समाधान करने के लिए केवल अपने कोड की आवश्यकता होती है, तो उन्हें किसकी जरूरत है? मैं अब अपना समाधान लिखने के लिए प्रेरित हूं, इसलिए मैं उस पर काम करूंगा।
रेनबोल्ट

बहुत बढ़िया, जो मुझे उम्मीद थी कि यह करेगा। बेझिझक उधार लें / मेरे जवाब से कुछ भी चुराएं जो आपको उपयोगी लगता है! हालाँकि मुझे आशा है कि अन्य लोग सिर्फ अपने और ओपी के अलावा अन्य लोगों को सुलझाने की कोशिश करेंगे: P
प्रोग्रामरडान

मैं दरकिनार हो गया और आपके कोड को छोटा करने लगा। यदि आपको लगता है कि आपका उत्तर पहले से कठिन था, तो इसे देखें: tny.cz/17ef0b3a । एक काम अभी भी प्रगति में है।
रेनबोल्ट

हाहा, तुम सच में दरकिनार हो गए। अच्छा लग रहा है (कोड-गोल्फ के लिए उचित रूप से भीषण! आप जानते हैं कि मेरा क्या मतलब है) अब तक!
प्रोग्रामरडान

@Rusher कोई भी भाग्य अब तक? मुझे सुधार के लिए कुछ विचार मिले हैं, मैं मार्ग-प्रतिनिधित्व संपीड़न तकनीक और पहले से ही संसाधित मार्गों (एक बिंदु तक) के माध्यम से तेजी से आगे बढ़ने का एक तरीका शामिल हूं।
प्रोग्रामरडान

2

एक समाधान पर कुछ सार नोट

अगर मुझे समय मिले तो मैं इसे एक एल्गोरिथ्म में बदल दूंगा ...

किसी दिए गए ग्राफ़ के लिए Gफिर एक जुड़ा उप-ग्राफ़ मौजूद G'होता है जिसमें शहर होता है 1। अगर वहाँ एक अनंत समाधान है तो किसी कनेक्ट किए गए उप ग्राफ उपलब्ध नहीं होगा G''की G'जिसमें Vकस्बों और Pपथ।

के पथों Pका G''विभाजन इस तरह किया जा सकता है {p}जिसमें एक पथ होता है जिसमें तब सभी रास्तों की न्यूनतम लागत होती है Pऔर P/{p}अन्य सभी पथ होते हैं (एक फैले हुए वृक्ष या संभवतः एक चक्र का निर्माण)। अगर हम मान लेते हैं कि pएक पाशन बढ़त (समान शहर के लिए दोनों सिरों को जोड़ने) तो यह दो शहरों में (कनेक्ट करेगा नहीं है v1और v2) और मूल्य है cगोला बारूद तो आप (उत्तरजीवी) फिर से पार कर सकते हैं v1करने के लिए v2की कुल लागत पर और वापस 2cगोला बारूद और इस (के कुल वृद्धि के लिए 2 से सभी शहरों में गोला बारूद में वृद्धि होगी 2|V|भीतर G''- जिनमें से कुछ से एकत्र किया गया है जाएगा v1और v2)।

आप से यात्रा कर रहे हैं v1करने के लिए v2और वापस करने के लिए v1कई ( m) बार और फिर से एक यात्रा v1किनारों के साथ P/{p}सभी के अलावा अन्य शहरों की यात्रा करने के लिए v1और v2वापस लौटने से पहले v1और इस लेता है nप्राप्त करने के लिए पथ (जहां |P/{p}| ≤ n ≤ 2|P/{p}|के बाद से आप अधिक एक रास्ता पार करने के लिए आवश्यकता नहीं होनी चाहिए की लागत से दो बार) kऔर कस्बों में 2m|V|गोला-बारूद प्राप्त होगा (फिर से जो कुछ ट्रावेल के दौरान एकत्र किया गया होगा)।

यह सब देखते हुए फिर आप बता सकते हैं कि क्या अनंत समाधान संभावित रूप से संभव है अगर लागत k + 2mcकुल इनाम के बराबर या कम है 2(m+n)|V|

उस समस्या के लिए एक अतिरिक्त जटिलता है:

  • आप शुरू करने से शहर से यात्रा करने के लिए आवश्यकता हो सकती है 1के लिए {p}पहले यात्रा करते हैं और इस लागत में कारक की आवश्यकता पर; तथा
  • आप यह भी सुनिश्चित करना है कि जरूरत है mऔर nकम करने के लिए पर्याप्त है कि आप आग्नेयास्त्र नहीं थे नहीं है इससे पहले कि आप यह पहली यात्रा के माध्यम से कर सकते हैं के बाद से पहली यात्रा बाद में पुनरावृत्तियों से अधिक लागत के होगा) कर रहे हैं।

यह प्रश्न में उदाहरण के लिए एक 24 पथ लागत तटस्थ समाधान की ओर जाता है (संख्याओं का दौरा किए गए शहर हैं):

1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,2,4,2,5,2,3, ... and repeat ...

जोड़ने के लिए एक छोटी सी बात - आपको 1 की लागत के साथ किनारों पर लूपिंग पर विचार करना पड़ सकता है, क्योंकि वे किनारे अकेले एक जीत की स्थिति बनाते हैं यदि आप उन्हें समय पर पहुंचा सकते हैं।
रेनबोल्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.