با استفاده از الگوریتم Dijkstra مشکل پیدا کردن کوتاهترین مسیر را حل کنید.
کوتاهترین مسیر را از X0 تا X7 پیدا کنید. نمودار توسط عناصر ماتریس هزینه ارائه شده است
این نمودار را بسازید
بیایید با عنصر X0 شروع کنیم و برچسب 0 را به آن اختصاص دهیم ، همه همسایگان خود را در نظر بگیرید ، زیرا هنوز هیچ علامتی وجود ندارد ، سپس طول های مربوطه را به آنها اختصاص دهید:
همه همسایگان X0 در نظر گرفته می شوند ، آن را علامت بزنید و به بالای X1 بروید. همسایگان آن X0، X2، X4 هستند اما X0 دارای برچسب است ، ما آن را در نظر نمی گیریم. برای X2: ترک یک نشان.
برای X4: برچسب را جایگزین کنید. همه همسایگان راس X1 در نظر گرفته می شوند ، آن را علامت گذاری کنید
به بالای X2 بروید. همسایگان آن X0، X1، X3، X4، X5، X6 هستند اما X0، X1 مشخص شده اند ، ما آنها را در نظر نمی گیریم.
برای X3: ترک یک نشان.
برای X5: برچسب را جایگزین کنید.
برای X4: ترک یک نشان.
برای X6: برچسب را جایگزین کنید.
همه همسایگان راس X2 در نظر گرفته شده است ، ما آن را علامت گذاری می کنیم.
به بالای X3 بروید. همسایگان آن X0 ، X2 ، X6 هستند ، اما X0 ، X2 دارای برچسب هستند ، ما آنها را در نظر نمی گیریم.
برای X6: ترک یک نشان.
همه همسایگان راس X3 در نظر گرفته شده است ، ما آن را علامت گذاری می کنیم.
به بالای X4 بروید. همسایگان آن X1، X2، X5، X7 هستند اما X1، X2 دارای برچسب هستند ، ما آنها را در نظر نمی گیریم.
برای X5: برچسب را جایگزین کنید.
برای X7: برچسب را جایگزین کنید.
همه همسایگان راس X4 در نظر گرفته شده است ، ما آن را علامت گذاری می کنیم.
به بالای X5 بروید. همسایگان آن X2، X4، X6، X7 هستند اما X2، X4 دارای برچسب هستند ، ما آنها را در نظر نمی گیریم.
برای X6: ترک یک نشان.
برای X7: ترک یک نشان.
همه همسایگان راس X5 در نظر گرفته شده است ، ما آن را علامت گذاری می کنیم.
به بالای X6 بروید. همسایگان آن X2، X3، X5، X7 اما X2، X3، X5 مشخص شده اند ، ما آنها را در نظر نمی گیریم.
برای X7: ترک یک نشان.
همه همسایگان راس X6 بررسی می شوند ، ما آن را علامت گذاری می کنیم. و باقیمانده X7 را علامت گذاری کنید ، تمام رئوسها در نظر گرفته می شوند.
نتیجه گیری: کوتاهترین مسیر X0 تا X7 طول آن 101 طول است: X7-X4-X1-X0.
الگوریتم Dijkstra (الگوریتم Dijkstra) یک الگوریتم گراف است که توسط دانشمند هلندی Edsger Dijkstroy در سال 1959 ابداع شده است. کوتاهترین مسیرها را از یکی از رئوس های نمودار به سایر موارد می یابد. الگوریتم کار می کند فقط برای نمودارهای بدون لبه های وزن منفی.
اجرای الگوریتم را به عنوان مثال از نمودار نشان داده شده در شکل در نظر بگیرید.
فرض کنید می خواهید از اولین قله تا همه موارد دیگر کوتاهترین فاصله را پیدا کنید.
حلقه ها راسها را نشان می دهند ، خطوط مسیرهای بین آنها (لبه های نمودار) را نشان می دهند. حلقه\u200cها تعداد رأسها را نشان می دهند ؛ در بالای لبه ها ، "قیمت" آنها نشان داده شده است - طول مسیر. یک برچسب به رنگ قرمز در کنار هر راس مشخص شده است - طول کوتاهترین مسیر این راس از راس 1.
گام اول. برای مثال ما مرحله الگوریتم Dijkstra را در نظر بگیرید. حداقل برچسب دارای راس 1 است. همسایگان آن راسهای 2 ، 3 و 6 هستند.
اولین همسایه به نوبه خود راس 1 است ، vertex 2 ، زیرا مسیر رسیدن به آن حداقل است. طول مسیر داخل آن از طریق vertex 1 برابر است با مقدار مقدار برچسب راس 1 و طول لبه که از 1 به 2 می رود ، یعنی 0 + 7 \u003d 7. این کمتر از برچسب فعلی vertex 2 ، بینهایت است ، بنابراین برچسب جدید 2 است. راس 7 است.
ما یک عمل مشابه با دو همسایه دیگر راس 1 - 3 و 6 انجام می دهیم.
همه همسایگان vertex 1 تأیید شده اند. حداقل فاصله فعلی تا اوج 1 نهایی در نظر گرفته شده و در معرض تجدید نظر نیست (ابتدا E. Dijkstra ثابت کرد که اینگونه است). آن را از نمودار عبور دهید تا توجه داشته باشید که از این قله بازدید شده است.
مرحله دوم. مرحله الگوریتم تکرار می شود. دوباره "نزدیکترین" قله های ناظر را می یابیم. این vertex 2 با برچسب 7 است.
باز هم ، ما سعی می کنیم برچسب های همسایگان راس انتخاب شده را کاهش دهیم ، سعی می کنیم از طریق راس 2 از آنها عبور کنیم. همسایگان قله 2 قله های 1 ، 3 و 4 هستند.
اولین همسایه vertex 2 vertex 1 است. اما از قبل بازدید شده است ، بنابراین ما با اولین راس هیچ کاری نمی کنیم.
همسایه بعدی vertex 2 vertex 3 است ، زیرا دارای حداقل برچسب راسهایی است که به عنوان بازدید نشده نشان داده شده است. اگر از طریق 2 به داخل آن بروید ، طول این مسیر برابر 17 خواهد بود (7 + 10 \u003d 17). اما برچسب فعلی راس سوم 9 است که کمتر از 17 است ، بنابراین برچسب تغییر نمی کند.
اگر همسایه دیگر vertex 2 vertex 4. باشد ، اگر از طریق مسیر 2 به داخل آن بروید ، طول این مسیر با مجموع کوتاهترین فاصله تا راس 2 و فاصله بین راسهای 2 و 4 برابر خواهد بود ، یعنی 22 (7 + 15 \u003d 22) . از سال 22<, устанавливаем метку вершины 4 равной 22.
همه همسایگان vertex 2 اسکن می شوند ، مسافت را تا آن مسدود کرده و در صورت بازدید آن را علامت بزنید.
مرحله سوم. ما مرحله الگوریتم را با انتخاب راس 3 تکرار می کنیم. پس از پردازش آن نتایج زیر را بدست می آوریم:
مراحل بعدی. مرحله الگوریتم را برای رئوس های باقی مانده تکرار کنید. اینها ترتیب ترتیب 6 ، 4 و 5 خواهند بود.
تکمیل الگوریتم. این الگوریتم زمانی پایان می یابد که دیگر پردازش یک راس واحد امکان پذیر نباشد. در این مثال ، تمام رئوسها از هم عبور می كنند ، با این وجود ، اشتباه است كه فرض كنیم كه در هر مثال اینگونه خواهد بود - بعضی از راسها اگر نتوانند به دست بیایند ، باقی مانده اند ، یعنی اگر گراف از هم جدا شود ، ممكن است بدون رمز باقی بماند. نتیجه الگوریتم در شکل آخر قابل مشاهده است: کوتاهترین مسیر از بالای 1 تا 2 7 است ، به 3 - 9 ، به 4 - 20 ، به 5 - 20 ، تا 6 - 11.
اجرای الگوریتم در زبان های مختلف برنامه نویسی:
C ++
#includ "stdafx.h" #includپاسکال
برنامه DijkstraAlgorithm؛ از crt استفاده می کند؛ const V \u003d 6؛ inf \u003d 100000؛ نوع بردار \u003d آرایه عدد صحیح؛ var start: عدد صحیح؛ const GR: array of integer \u003d ((0، 1، 4، 0، 2، 0)، (0، 0، 0، 9، 0، 0)، (4، 0، 0، 7، 0، 0)، (0 ، 9 ، 7 ، 0 ، 0 ، 2) ، (0، 0، 0، 0، 0، 8)، (0، 0، 0، 0، 0، 0، 0، 0))؛ (الگوریتم Dijkstra) روش Dijkstra (GR: آرایه عدد صحیح؛ st: عدد صحیح)؛ تعداد متغیر ، شاخص ، من ، تو ، متر ، دقیقه: عدد صحیح؛ فاصله: بردار؛ بازدید: آرایه از boolean؛ شروع m: \u003d st؛ برای i: \u003d 1 تا V فاصله را شروع کنید [i]: \u003d inf؛ بازدید [i]: \u003d false؛ پایان؛ فاصله: \u003d 0؛ برای شمارش: \u003d 1 تا V-1 min شروع می شود: \u003d inf؛ برای i: \u003d 1 تا V انجام دهید اگر (بازدید نشده [i]) و (مسافت [i]<=min) then begin min:=distance[i]; index:=i; end; u:=index; visited[u]:=true; for i:=1 to V do if (not visited[i]) and (GR<>0) و (فاصله [u]<>inf) و (فاصله [u] + GRجاوا
وارد کردن java.io.BufferedReader؛ وارد کردن java.io.IOException؛ وارد کردن java.io.InputStreamReader؛ وارد کردن java.io.PrintWriter؛ وارد کردن java.util.ArrayList؛ وارد کردن java.util.Arrays؛ وارد کردن java.util.StringTokenizer؛ Solution کلاس عمومی (private static int INF \u003d Integer.MAX_VALUE / 2؛ int int n؛ // تعداد تعداد راس ها در intr خصوصی خصوصی برای digraph ؛ // تعداد راسها در ArrayList خصوصی دیجیتال)گزینه ای دیگر:
وارد کردن java.io. *؛ وارد کردن java.util. *؛ کلاس عمومی Dijkstra (بخش خصوصی استاتیک Graph.Edge GRAPH \u003d (نمودار جدید.Edge ("a" ، "b" ، 7) ، Graph.Edge جدید ("a" ، "c" ، 9) ، Graph.Edge جدید ( "a" ، "f" ، 14) ، Graph.Edge جدید ("b" ، "c" ، 10) ، Graph.Edge جدید ("b" ، "d" ، 15) ، Graph.Edge جدید ("c "،" d "، 11) ، Graph.Edge جدید (" c "،" f "، 2) ، Graph.Edge جدید (" d "،" e "، 6) ، Graph.Edge جدید (" e "، "f" ، 9) ،) ؛ رشته ثابت استاتیک STAR START \u003d "a" ؛ انتهای ثابت استاتیک رشته نهایی \u003d "e" ؛ اصلی خالی استاتیک اصلی (استدلال رشته) (نمودار g \u003d نمودار جدید (GRAPH) ؛ g.dijkstra (شروع) ؛ g.printPath (خاتمه) ؛ //g.printAllPaths () ؛)) نمودار کلاس (نقشه نهایی خصوصی
ج
#عبارتند ازپی اچ پی
$ edge، "هزینه" \u003d\u003e $ edge)؛ $ همسایگان [$ edge] \u003d آرایه ("پایان" \u003d\u003e $ edge ، "هزینه" \u003d\u003e $ edge)؛ ) $ vertices \u003d array_unique ($ vertices)؛ foreach ($ vertices به عنوان $ vertex) ($ dist [$ vertex] \u003d INF؛ $ قبلی [$ vertex] \u003d NULL؛) $ dist [$ منبع] \u003d 0؛ $ Q \u003d $ vertices؛ در حالی که (شمارش ($ Q)\u003e 0) (// TODO - راه سریعتر برای بدست آوردن حداقل $ min \u003d INF را پیدا کنید ؛ پیشگویی ($ Q به عنوان $ vertex) (اگر ($ dist [$ vertex])< $min) { $min = $dist[$vertex]; $u = $vertex; } } $Q = array_diff($Q, array($u)); if ($dist[$u] == INF or $u == $target) { break; } if (isset($neighbours[$u])) { foreach ($neighbours[$u] as $arr) { $alt = $dist[$u] + $arr["cost"]; if ($alt < $dist[$arr["end"]]) { $dist[$arr["end"]] = $alt; $previous[$arr["end"]] = $u; } } } } $path = array(); $u = $target; while (isset($previous[$u])) { array_unshift($path, $u); $u = $previous[$u]; } array_unshift($path, $u); return $path; } $graph_array = array(array("a", "b", 7), array("a", "c", 9), array("a", "f", 14), array("b", "c", 10), array("b", "d", 15), array("c", "d", 11), array("c", "f", 2), array("d", "e", 6), array("e", "f", 9)); $path = dijkstra($graph_array, "a", "e"); echo "path is: ".implode(", ", $path)."\n";
پایتون
از واردات مجموعه namestuple ، صف از واردات pprint pprint به عنوان pp inf \u003d float ("inf") Edge \u003d namestuple ("Edge" ، "شروع ، پایان ، هزینه") کلاس نمودار (): def __init __ (خود ، لبه ها): self .edges \u003d edge2 \u003d self.vertices \u003d set (sum ((برای e در edge2) ،))) def dijkstra (خود ، منبع ، مقصد): منبع را در self.vertices dist \u003d (vertex: inf for vertex in self.vertices ) previous \u003d (vertex: هیچکدام برای vertex در self.vertices) dist \u003d 0 q \u003d self.vertices.copy () همسایگان \u003d (vertex: set () برای vertex در self.vertices) برای شروع ، پایان ، هزینه در خود. لبه ها: همسایگان. ((پایان ، هزینه)) \u003d dest: break for v، هزینه در همسایگان [u]: alt \u003d dist [u] + هزینه اگر alt< dist[v]: # Relax (u,v,a)
dist[v] = alt
previous[v] = u
#pp(previous)
s, u = deque(), dest
while previous[u]:
s.pushleft(u)
u = previous[u]
s.pushleft(u)
return s
graph = Graph([("a", "b", 7), ("a", "c", 9), ("a", "f", 14), ("b", "c", 10),
("b", "d", 15), ("c", "d", 11), ("c", "f", 2), ("d", "e", 6),
("e", "f", 9)])
pp(graph.dijkstra("a", "e"))
Output:
["a", "c", "d", "e"]
از میان بسیاری از الگوریتم ها برای یافتن کوتاهترین مسیرها در یک نمودار ، در Habr فقط توضیحی از الگوریتم Floyd-Warshall پیدا کردم. این الگوریتم کوتاهترین مسیرها را بین همه راسهای نمودار و طول آنها پیدا می کند. در این مقاله ، اصل کارکرد الگوریتم Dijkstra را شرح می دهم ، که مسیرهای بهینه و طول آنها را بین یک راس خاص (منبع) و تمام رئوسهای دیگر نمودار پیدا می کند. ضرر این الگوریتم این است که اگر نمودار دارای قوسهای وزن منفی باشد ، به درستی کار نخواهد کرد.
به عنوان مثال ، نمودار گرا گرا را در نظر بگیرید:
ما می توانیم این نمودار را به صورت ماتریس C نمایان کنیم:
به عنوان یک منبع vertex 1 را بدست آورید.این بدان معنی است که ما کوتاهترین مسیرها را از راس 1 تا vertices 2 ، 3 ، 4 و 5 جستجو خواهیم کرد.
این الگوریتم قدم به قدم در تمام محورهای نمودار تکرار می شود و برچسب هایی را به آنها اختصاص می دهد ، که حداقل فاصله شناخته شده از راس منبع تا یک راس خاص است. این الگوریتم را به عنوان نمونه در نظر بگیرید.
برچسب 1 را به یک برچسب برابر با 0 اختصاص دهید ، زیرا این راس منبع است. راس های باقیمانده به برچسب هایی برابر با بی نهایت اختصاص می یابد.
بعد ، ما یک راس W انتخاب می کنیم که دارای برچسب حداقل باشد (اکنون آن راس 1 است) و تمام راسهایی را که از راس W در آن وجود دارد مسیری را در نظر می گیریم که شامل راس های واسطه ای نباشد. ما به هر یک از رئوس های در نظر گرفته شده برابر با برچسب W و طول مسیر از W تا راس مورد نظر یک برچسب اختصاص می دهیم ، اما فقط درصورتی که مبلغ بدست آمده از مقدار برچسب قبلی کمتر باشد. اگر مبلغ کمتر نیست ، برچسب قبلی را بدون تغییر بگذارید.
بعد از اینکه کلیه راسهایی را که مسیری مستقیم از W در آن وجود دارد بررسی کردیم ، راس W را به عنوان بازدید علامت گذاری می کنیم ، و یکی از کسانی که هنوز بازدید نشده را انتخاب کنید که دارای حداقل مقدار برچسب باشد ، راس بعدی W خواهد بود. در این حالت ، این vertex 2 است. یا 5. اگر چندین برآمدگی با همان برچسب ها وجود دارد ، فرقی نمی کند کدام یک را به عنوان W انتخاب کنیم.
ما راس 2. را انتخاب خواهیم کرد. اما هیچ مسیر خروجی واحدی از آن وجود ندارد ، بنابراین ما فوراً این راس را به عنوان بازدید علامت گذاری می کنیم و با حداقل علامت به سمت راس بعدی حرکت می کنیم. این بار فقط vertex 5 دارای برچسب حداقل است. تمام قله هایی که در آنها خطوط مستقیم 5 وجود دارد را در نظر بگیرید ، اما هنوز هم به عنوان بازدید مشخص نشده اند. باز هم مقدار برچسب راس W و وزن لبه را از W تا راس فعلی می یابیم و اگر این مبلغ از برچسب قبلی کمتر باشد ، مقدار علامت برچسب را با مبلغ دریافتی جایگزین می کنیم.
براساس تصویر ، می توانیم ببینیم که برچسب های قله های 3 و 4 کوچکتر شده اند ، یعنی مسیری کوتاه تر از این قله ها از بالای منبع پیدا شده است. در مرحله بعد ، راس 5 را به عنوان بازدید علامت بزنید و راس بعدی را که حداقل یک برچسب دارد انتخاب کنید. ما تمام اقدامات فوق را تکرار می کنیم تا زمانی که قله های بدون نظارت وجود نداشته باشد.
پس از انجام تمام اقدامات ، نتیجه زیر را می گیریم:
همچنین یک بردار P وجود دارد که از آن می توان کوتاهترین مسیرها را ساخت. با توجه به تعداد عناصر ، این بردار برابر با تعداد راسهای موجود در نمودار است.هر عنصر شامل آخرین راس میانی در کوتاهترین مسیر بین راس منبع و راس نهایی است. در ابتدای الگوریتم ، تمام عناصر بردار P برابر با راس منبع هستند (در مورد ما ، P \u003d (1 ، 1 ، 1 ، 1 ، 1)). در مرحله بعد ، در مرحله محاسبه مجدد مقدار برچسب برای راس مورد نظر ، اگر برچسب راس مورد نظر به كوچكتر تغییر یابد ، مقدار vertex فعلی W را به آرایه P. می نویسیم. علاوه بر این ، در W \u003d 5 ، برچسب راس 3 به "20" تغییر یافته است ، بنابراین مقدار را در بردار P - P \u003d 5 خواهیم نوشت. همچنین در W \u003d 5 ، مقدار برچسب در راس 4 تغییر یافت ("50" بود ، "40" شد) ، بنابراین باید مقدار W را به عنصر 4 بردار P - P \u003d 5 اختصاص دهید. در نتیجه ، بردار P \u003d (1 ، 1 ، 5 ، 5 ، 1) بدست می آوریم.
با دانستن اینکه در هر عنصر بردار P آخرین راس میانی در مسیر بین منبع و راس نهایی ثبت می شود ، می توانیم خود کوتاهترین مسیر را بدست آوریم.
کوتاهترین مسیر امروزه این یک کار حیاتی است و تقریباً در همه جا مورد استفاده قرار می گیرد ، از پیدا کردن مسیر بهینه بین دو شیء روی زمین (به عنوان مثال کوتاهترین مسیر از خانه به دانشگاه) ، در سیستم های اتوماتیک ، برای یافتن مسیر مطلوب برای حمل و نقل ، تعویض بسته اطلاعات در شبکه ها و و غیره.کوتاهترین مسیر با کمک برخی از شیء ریاضی به نام نمودار بررسی می شود. جستجو کردن کوتاهترین مسیر بین دو راس داده شده در نمودار کشیده شده است. نتیجه یک مسیر است ، یعنی دنباله ای از رئوس و لبه های حادثه به دو راس مجاور و طول آن.
سه مورد را بیشتر در نظر بگیرید الگوریتم کارآمد یافته کوتاهترین مسیر:
- الگوریتم Dijkstra;
- الگوریتم فلوید؛
- الگوریتم های جستجو
این الگوریتم ها با تعداد کمی از رئوس در نمودار به راحتی اجرا می شوند. با افزایش تعداد آنها ، کار جستجو کوتاهترین مسیر بغرنج.
الگوریتم Dijkstra
این الگوریتم یک الگوریتم نمودار است ، که توسط دانشمند هلندی E. Dijkstroy در سال 1959 اختراع شد. این الگوریتم کمترین فاصله را از یکی از راس نمودار نسبت به سایرین پیدا می کند و فقط برای نمودارهای بدون لبه های وزن منفی کار می کند.
وزن به هر راس اختصاص داده می شود - این وزن مسیر از راس اولیه به داده معین است. هر راس نیز می تواند انتخاب شود. اگر یک راس انتخاب شود ، آنگاه مسیر از آن به سمت راس اولیه کوتاهترین است ، در غیر این صورت ، موقتی است. با دور زدن نمودار ، الگوریتم مسیری را برای هر راس در نظر می گیرد و اگر کوتاه ترین باشد ، راس را انتخاب می کند. وزن این راس به وزن مسیر تبدیل می شود. برای همه همسایگان یک راس مشخص ، الگوریتم نیز وزن را محاسبه می کند ، در حالی که تحت هیچ شرایطی آنها را برجسته نمی کند. این الگوریتم کار خود را تمام می کند ، به اوج نهایی می رسد و وزن می کند کوتاهترین مسیر وزن راس نهایی می شود.
الگوریتم Dijkstra
مرحله 1. به تمام رئوس ها به جز اولین ، وزنی برابر با بی نهایت اختصاص داده می شود ، و اولین راس 0 قرار می گیرد.
مرحله 2. کلیه رئوس انتخاب نشده است.
مرحله 3. اولین راس جریان جاری است.
مرحله 4: وزن کلیه راسهای انتخاب نشده طبق فرمول محاسبه می شود: وزن یک راس انتخاب نشده حداقل عدد از وزن قدیمی یک راس داده شده ، جمع وزن وزنه راس جریان و وزن لبه اتصال راس جریان با غیر انتخابی است.
مرحله 5. در میان راس های انتخاب نشده ، راس با حداقل وزن جستجو می شود. اگر کسی پیدا نشود ، یعنی وزن همه راسها بی نهایت است ، پس مسیر وجود ندارد. بنابراین ، راه بیرون. در غیر این صورت ، راس یافت شده جریان می یابد. او ایستاده است.
مرحله 6. اگر راس فعلی محدود باشد ، در این صورت مسیر پیدا می شود ، و وزن آن وزن راس نهایی است.
مرحله 7. به مرحله 4 بروید.
در اجرای نرم افزار الگوریتم های Dijkstra ما مجموعه ای از راس S را ساختیم که کوتاهترین مسیرها از راس اولیه در حال حاضر شناخته شده است. در هر مرحله ، یکی از رئوس های باقیمانده به مجموعه S اضافه می شود ، فاصله آن از راس اولیه نسبت به دیگر راس های باقیمانده کمتر است. در این حالت از آرایه D استفاده خواهیم کرد که در آن طول ها نوشته شده است کوتاهترین مسیرها برای هر راس. هنگامی که مجموعه S شامل تمام عمودهای نمودار باشد ، آنگاه آرایه D شامل طولها خواهد بود کوتاهترین مسیرها از راس اولیه به هر راس.
علاوه بر این آرایه ها ، ما از یک ماتریس به طول C استفاده خواهیم کرد ، جایی که عنصر C طول لبه (i ، j) باشد ، اگر لبه ای در آن نباشد ، در این صورت طول آن بینهایت فرض می شود ، یعنی بیش از هر طول واقعی لبه ها. در حقیقت ، ماتریس C است ماتریس مجاورکه در آن تمام عناصر صفر با بی نهایت جایگزین می شوند.
برای تعیین خیلی
در پایان مسابقات عید نوروز ، حامی تصمیم گرفت از طریق نامه هدیه به برندگان جوایز بفرستد. با دانستن تعداد شرکت کنندگان $ n $ و زمان تحویل نامه بین برخی از بخش های Ukrposhta ، پس از حداقل زمان آخرین برندگان جایزه خود را دریافت کنید.
داده های ورودی
خط اول شامل شماره 3 $ $ است: تعداد شرکت کنندگان در مسابقات مسابقات $ n $ ، تعداد جایزه های حامی مالی $ M $ و تعداد زمان تحویل شناخته شده بین برخی از بخش ها $ k $ $. خط بعدی حاوی فضایی بین تعداد شرکت کنندگان که برنده شدند.
خط بعدی $ k $ 3 عدد 3 $ که هرکدام دارای اطلاعاتی در مورد زمان تحویل شناخته شده بین برخی از شعب در قالب هستند: $ a $ b $ $ t $ $ ، جایی که $ a $ و $ b $ تعداد شعب ، $ t $ $ (0 \\ leqslant t \\ leqslant 365) $ - زمان تحویل نامه پست بین آنها. آخرین خط شامل یک شماره واحد است - شماره اداره پست که از آن حامی مالی جوایز می فرستد. شناخته شده است که $ 1 \\ leqslant n ، m، a، b \\ leqslant 365 $.
خروجی
اگر همه جوایز به شرکت کنندگان تحویل داده شد ، "حامی خوب!" را در سطر اول و در ردیف بعدی چاپ کنید ، زمانی که آخرین نفر از برندگان جایزه خود را دریافت می کنند. اگر حداقل یکی از شرکت کنندگان نتواند جایزه دریافت کند ، در تنها خط "این مقصر حامی نیست ..." است. چاپ عبارات بدون نقل قول.
آزمایشات
№ | داده های ورودی | خروجی |
1. | 3 2 2 2 3 1 2 3 2 3 4 1 |
حامی خوب! 7 |
2. | 5 1 4 5 1 3 2 2 3 3 4 2 5 4 5 6 1 |
حامی خوب! 16 |
3. | 7 2 6 1 3 1 3 2 2 4 32 4 5 94 3 1 0 6 2 4 7 2 3 7 |
این تقصیر اسپانسر نیست ... |
4. | 5 2 6 1 2 3 1 1 3 4 2 2 4 3 5 1 4 4 5 5 2 3 7 2 |
حامی خوب! 6 |