Энэ нь яагаад нумаас илүү шулуун шугамд байгааг та мэдэх үү? Хоёр зэрэгцээ шугамын хоорондох зайг тодорхойлох Хоёр цэгийн хоорондох хамгийн богино зай хэд вэ

Зурган дээрх тасархай шугамын дагуух зам нь хатуу шугамын дагуух замаас богино байна. Одоо далайн замын жишээн дээр арай илүү дэлгэрэнгүй:

Хэрэв та байнгын чиглэлд чиглүүлбэл хөлөг онгоцны хөдөлгөөний замнал дэлхийн гадаргууматематикт гэж нэрлэгддэг муруй байх болно логарифмспираль.

Навигацийн хувьд энэхүү нарийн төвөгтэй давхар муруйлт шугам гэж нэрлэгддэг локодромиа, Грек хэлээр "ташуу гүйх" гэсэн утгатай.

Гэхдээ дэлхийн бөмбөрцгийн хоёр цэгийн хоорондох хамгийн богино зайг том тойргийн нумын дагуу хэмждэг.

Агуу тойргийн нумыг дэлхийн төвийг дайран өнгөрч буй хавтгайтай дэлхийн гадаргуугийн огтлолцолоос ул мөр хэлбэрээр олж авч, бөмбөг болгон авдаг.

Навигацид том тойрог нумыг нэрлэдэг агуу тойрог, Энэ нь "шулуун гүйлт" гэсэн утгатай. Их тойргийн хоёр дахь онцлог нь меридиануудыг өөр өөр өнцгөөр дайран өнгөрдөг (Зураг 29).

Локсодром ба ортодромын дагуу дэлхийн гадарга дээрх хоёр цэгийн хоорондох зайны зөрүү нь зөвхөн далай тэнгисийн томоохон гарцуудад практик ач холбогдолтой юм.

Хэвийн нөхцөлд энэ ялгааг үл тоомсорлож, навигаци нь байнгын курсээр явагддаг, i.e. локодромоор.

Тэгшитгэлийг гаргахын тулд бид локодромуудыг авна (Зураг 30, а) хоёр цэг ГЭХДЭЭболон AT,Тэдний хоорондох зай нь ердөө л бага юм. Меридианууд ба тэдгээрийн дундуур параллель зурснаар бид энгийн тэгш өнцөгт бөмбөрцөг гурвалжинг олж авдаг ABC.Энэ гурвалжинд меридиан ба параллель огтлолцолоос үүссэн өнцөг нь зөв, өнцөг нь ПnABК.Катет хөлөг онгоцны урсгалтай тэнцүү байна АСмеридиан нумын сегментийг төлөөлдөг бөгөөд үүнийг илэрхийлж болно

хаана Р - бөмбөрцөг хэлбэрээр авсан дэлхийн радиус;

Δφ - өргөргийн үндсэн өсөлт (өргөргийн ялгаа).

хөл SWзэрэгцээ нумын сегментийг илэрхийлнэ

хаана r - параллель радиус;

Δλ - уртрагын үндсэн ялгаа.

OO 1 C гурвалжингаас гэдгийг олж болно

Дараа нь эцсийн хэлбэрт хөл болно SWдараах байдлаар илэрхийлж болно.

Энгийн бөмбөрцөг гурвалжин гэж үзвэл ABCхавтгай, бичих

Буурсны дараа Р мөн координатын энгийн жижиг өсөлтийг хязгааргүй цөөн тоогоор солих нь бидэнд байна

Бид үүссэн илэрхийлэлийг φ 1, λ 1-ээс φ 2 хүртэлх мужид нэгтгэдэг. λ 2 tgK-ийн утгыг тогтмол утга гэж үзвэл:

Баруун талд бид хүснэгт хэлбэрийн интегралтай байна. Үүний утгыг орлуулсны дараа бид бөмбөг дээрх локодром тэгшитгэлийг олж авна

Энэхүү тэгшитгэлийн дүн шинжилгээ нь дараахь дүгнэлтийг гаргах боломжийг бидэнд олгоно.

0 ба 180 ° -ийн курсэд локодром нь том тойргийн нум болж хувирдаг - меридиан;

90 ба 270 ° -ын курсуудад локодром нь зэрэгцээтэй давхцдаг;

Локсодром параллель бүрийг зөвхөн нэг удаа, меридиан бүрийг тоолж баршгүй олон удаа гаталдаг. тэдгээр. шон руу спираль байдлаар ойртож, энэ нь түүнд хүрэхгүй.

Тогтмол чиглэлд, жишээлбэл, локодром дагуу навигаци хийх нь дэлхийн хоёр цэгийн хоорондох хамгийн богино зай биш боловч навигаторын хувьд ихээхэн тав тухтай байдлыг илэрхийлдэг.

Далайн навигацийн графикт тавигдах шаардлагыг локодромын дагуу навигацийн давуу тал, түүний тэгшитгэлийн шинжилгээний үр дүнд үндэслэн дараах байдлаар томъёолж болно.

1. Тогтмол өнцгөөр меридиануудыг гаталж буй локодромыг шулуун шугамаар дүрслэх нь зүйтэй.

2. газрын зургийн проекц, газрын зураг барихад ашигладаг, тэгш өнцөгт хэлбэртэй байх ёстой бөгөөд түүн дээрх курс, холхивч, өнцөг нь газар дээрх үнэ цэнэтэй тохирч байх ёстой.

3. 0, 90, 180° ба 270°-ийн курсын шугамууд шиг меридиан ба параллелууд нь харилцан перпендикуляр шулуун байх ёстой.

Бөмбөрцөг хэлбэрээр авсан дэлхийн гадаргуу дээрх өгөгдсөн хоёр цэгийн хоорондох хамгийн богино зай нь эдгээр цэгүүдийг дайран өнгөрөх том тойргийн нумуудын хамгийн бага нь юм. Меридиан эсвэл экваторыг дагаж буй хөлөг онгоцыг эс тооцвол их тойрог нь меридиануудыг өөр өөр өнцгөөр гаталдаг. Тиймээс ийм муруйг дагаж буй хөлөг онгоц чиглэлээ байнга өөрчлөх ёстой. Меридиануудтай тогтмол өнцөг үүсгэдэг, газрын зураг дээр Меркаторын проекцоор шулуун шугамаар дүрслэгдсэн локодромоор дүрсэлсэн замыг дагах нь илүү тохиромжтой. Гэсэн хэдий ч хол зайд ортодром ба локодромын уртын ялгаа нь мэдэгдэхүйц утгад хүрдэг. Тиймээс, ийм тохиолдолд ортодромыг тооцоолж, түүн дээр завсрын цэгүүдийг тэмдэглэж, тэдгээрийн хооронд локодромын дагуу сэлдэг.

Дээрх шаардлагыг хангасан зураг зүйн проекцийг Голландын зураг зүйч Жерард Крамер (Меркатор) 1569 онд санал болгосон бөгөөд түүнийг бүтээгчийн хүндэтгэлд зориулж уг проекцийг нэрлэжээ. Меркатор.

Мөн хэн илүү авахыг хүсэх билээ сонирхолтой мэдээлэлилүү их судла Өгүүллийн эх хувийг вэбсайт дээр байрлуулсан InfoGlaz.rfЭнэ хуулбарыг хийсэн нийтлэлийн холбоос -

DISTANCE, зай, харьц. 1. Хоёр цэгийг заагласан зай, ямар нэг зүйлийн хоорондох зай. Шулуун шугамын хоёр цэгийн хоорондох хамгийн богино зай. Биднээс хоёр километрийн зайд амьдардаг. "Комендант тэднийг хамгийн ойрын зайд оруулав ... Толь бичигУшаков

зай- нэр үг, s., ашиглах. ихэвчлэн Морфологи: (үгүй) юу? юуны тулд зай вэ? зай, (харах) юу вэ? зайнаас? зай, юу? зайны тухай; pl. юу? зай, (үгүй) юу? зай, яагаад? зай, (харна уу) юу? зайнаас? зайнууд ... Дмитриевийн толь бичиг

зай- би; харьц. Хоёр цэг, хоёр объект гэх мэтийг тусгаарлах зай, хэн нэгний хоорондох зай, l-ээс илүү. Хамгийн богино гол хоёр цэгийн хооронд. Гэрээсээ сургууль руугаа Р. Ойролцоох гол руу ухарна. Нэг метрийн зайд гараа сунгасан. Ямар нэг зүйлийг мэдэх, мэдрэх. дээр… … нэвтэрхий толь бичиг

зай- би; харьц. бас үзнэ үү зай a) Хоёр цэг, хоёр объект гэх мэтийг тусгаарлах зай, хэн нэгний хоорондох зай, l-ээс. Хоёр цэгийн хоорондох хамгийн богино зай. Гэрээс сургууль хүртэлх зай. Ойрхон зайд ухрах / ни ... Олон хэллэгийн толь бичиг

ГЕометр- янз бүрийн хэлбэрийн (цэг, шугам, өнцөг, хоёр хэмжээст ба гурван хэмжээст биет) шинж чанар, тэдгээрийн хэмжээ, харьцангуй байрлалыг судалдаг математикийн салбар. Заахад хялбар болгох үүднээс геометрийг планиметр ба хатуу геометр гэж хуваадаг. AT…… Коллиер нэвтэрхий толь бичиг

Навигац*

Навигац- навигацийн хэлтэс (үзнэ үү), луужин, гуалин ашиглан далайд хөлөг онгоцны байршлыг тодорхойлох аргуудын танилцуулгыг дуусгах (үзнэ үү). Усан онгоцны далайд байгаа газрыг тодорхойлох нь газрын зураг дээр хөлөг онгоц байгаа цэгийг байрлуулахыг хэлнэ Энэ мөчбайрладаг.…… Нэвтэрхий толь бичиг Ф.А. Брокхаус ба И.А. Эфрон

КОГЕН- (Коэн) Херманн (1842 1918) Германы гүн ухаантан, Марбургийн нео-Кантизмын сургуулийг үндэслэгч, хамгийн нэр хүндтэй төлөөлөгч. Гол бүтээлүүд: "Кантын туршлагын онол" (1885), "Кант ёс зүйн үндэслэл" (1877), "Кант гоо зүйн үндэслэл" (1889), "Логик ... ...

Кант Иммануэль- Кант Иммануэль Кантын амьдралын замнал, зохиол бүтээлүүд 1724 онд Зүүн Пруссын Конигсберг (одоогийн Калининград) хотод төрсөн. Түүний аав эмээлчин, ээж нь гэрийн эзэгтэй байсан бөгөөд зургаан хүүхэд нь насанд хүрсэнгүй. Кант үргэлж эцэг эхээ ...... Барууны философи үүссэнээс өнөөг хүртэл

КАНТЫН ШҮҮМЖЛИЙН ФИЛОСОФИ: ЧАДВАРЫН ТУХАЙ СУРГААЛ- (Ла философийн шүүмж де Кант: Сургаалууд, 1963) Делеуз. Оршил хэсэгт трансцендент аргыг тайлбарлахдаа Кант гүн ухааныг бүх мэдлэгийг чухал зорилтуудтай холбох шинжлэх ухаан гэж ойлгодог гэж Делез тэмдэглэв. Философийн түүх: нэвтэрхий толь бичиг

фермийн зарчим- геометрийн оптикийн үндсэн зарчим (Геометрийн оптикийг үзнэ үү). F. p.-ийн хамгийн энгийн хэлбэр бол гэрлийн туяа нь замын дагуух хоёр цэгийн хоорондох орон зайд үргэлж тархдаг бөгөөд түүний өнгөрөх хугацаа нь ...-ээс бага байдаг гэсэн үг юм. Том Зөвлөлтийн нэвтэрхий толь бичиг

(Дүрслэх геометр)
  • CD (CXDX, C2D2)цэг хэлбэрээр харуулав C5 = D5 A5B5тэнцүү ...
    (Дүрслэх геометр)
  • Хоёр зэрэгцээ хавтгай хоорондын зайг тодорхойлох
    Ерөнхий байрлал дахь хоёр зэрэгцээ хавтгай хоорондын зайг тодорхойлох 01| XҮүнийг ижил хоёр хавтгайн хоорондох зайг тодорхойлох асуудал болгон бууруулж, проекцын байрлал болгон хувиргах нь тохиромжтой. Энэ тохиолдолд хавтгай хоорондын зайг шугамын хоорондох перпендикуляр, ...
    (Дүрслэх геометр)
  • Хоёр огтлолцох шугамын хоорондох зайг тодорхойлох
    Хэрэв та хоёр огтлолцсон шугамын хоорондох хамгийн богино зайг тодорхойлохыг хүсвэл проекцын хавтгайн системийг хоёр удаа өөрчлөх хэрэгтэй. Энэ асуудлыг шийдэхдээ шууд CD (CXDX, C2D2)цэг хэлбэрээр харуулав C5 = D5(Зураг 198). Энэ цэгээс төсөөлөл хүртэлх зай A5B5тэнцүү ...
    (Дүрслэх геометр)
  • Хоёр огтлолцсон шулуун шугамын хоорондох өнцөг
    Энэ нь өгөгдөлтэй параллель байгаа огтлолцсон хоёр шугамын хоорондох өнцөг юм. Тиймээс энэ даалгавар нь өмнөхтэй төстэй юм. Үүнийг шийдэхийн тулд дурын цэгийг авч, түүгээр өгөгдсөн хазайлттай параллель хоёр шулуун зурж, шаардлагатай өнцгийг тодорхойлохын тулд проекцын хувиргалтыг ашиглана....
    (Дүрслэх геометрийн үндэс. Богино курсболон даалгаврын цуглуулга.)
  • Хоёр зэрэгцээ шугамын хоорондох зайг тодорхойлох
    Проекцын хавтгайг давхар солих аргаар асуудлыг шийддэг. Эцсийн шатанд проекцын хавтгайнуудын аль нэг нь огтлолцсон шугамуудын аль нэгэнд перпендикуляр байх ёстой. Дараа нь тэдгээрийн хоорондох хамгийн богино зайг нөгөө хазайсан шугамтай перпендикуляр сегментийн утгаар тодорхойлно (Зураг 199).
    (Дүрслэх геометр)
  • Самбар дээр хоёр цэгийг шохойгоор тэмдэглэсний дараа багш залуу сурагчдад хоёр цэгийн хоорондох хамгийн богино замыг зурах даалгавар санал болгож байна.

    Оюутан бодсоныхоо дараа тэдгээрийн хооронд ороомгийн шугамыг хичээнгүйлэн зурдаг.

    - Энэ бол хамгийн дөт зам! багш гайхаж байна. - Хэн чамд үүнийг зааж өгсөн бэ?

    - Миний аав. Тэр бол таксины жолооч.

    Гэнэн сургуулийн сурагчийн зурсан зураг нь мэдээжийн хэрэг анекдот юм, гэхдээ зураг дээрх тасархай нуман гэж хэлвэл та инээмсэглэхгүй гэж үү. 1 бол Найдварын хошуунаас Австралийн өмнөд үзүүр хүртэлх хамгийн дөт зам юм!

    Илүү гайхалтай нь дараах мэдэгдэл юм: Зураг дээр дүрсэлсэн. Японоос Панамын суваг хүртэлх хоёр талын аялал нь нэг газрын зураг дээр зурсан шулуун шугамаас богино байна!

    Цагаан будаа. 1. Асаалттай далайн газрын зурагСайн найдварын хошуунаас Австралийн өмнөд үзүүр хүртэлх хамгийн богино замыг шулуун шугамаар ("локодром") заадаггүй, харин муруйгаар ("ортодроми") заадаг.


    Энэ бүхэн хошигнол мэт харагдаж байгаа ч зураг зүйчдийн сайн мэддэг маргаангүй үнэнүүд таны өмнө байдаг.




    Цагаан будаа. 2. Далайн график дээрх Йокохамаг Панамын сувагтай холбосон муруй зам нь ижил цэгүүдийн хооронд татсан шулуун шугамаас богино байгаа нь үнэхээр гайхалтай санагдаж байна.


    Асуудлыг тодруулахын тулд ерөнхийдөө диаграммуудын талаар, ялангуяа далайн хөлөг онгоцны талаар хэдэн үг хэлэх хэрэгтэй болно. Дэлхийн гадаргын хэсгийг цаасан дээр зурах нь зарчмын хувьд ч амар ажил биш, учир нь Дэлхий бол бөмбөрцөг бөгөөд бөмбөрцөг гадаргуугийн аль ч хэсгийг атираа, хугаралгүйгээр хавтгайд байрлуулах боломжгүй гэдгийг мэддэг. Газрын зураг дээрх зайлшгүй гажуудлыг өөрийн эрхгүй тэвчих хэрэгтэй болдог. Газрын зураг зурах олон аргыг зохион бүтээсэн боловч бүх газрын зураг дутагдалтай байдаггүй: зарим нь нэг төрлийн, зарим нь өөр төрлийн гажуудалтай байдаг, гэхдээ гажуудалгүй газрын зураг огт байдаггүй.

    Далайчид 16-р зууны Голландын хуучин зураг зүйч, математикчийн аргын дагуу зурсан газрын зургийг ашигладаг. Меркатор. Энэ аргыг Меркаторын проекц гэж нэрлэдэг. Далайн бүдүүвчийг тэгш өнцөгт тороор нь танихад хялбар байдаг: түүн дээр меридиануудыг хэд хэдэн зэрэгцээ шулуун шугамаар харуулсан; өргөргийн тойрог - мөн эхнийхтэй перпендикуляр шулуун шугамууд (5-р зургийг үз).

    Та нэг далайн боомтоос нөгөө далайн боомт хүртэлх хамгийн дөт замыг ижил параллель дээр олохыг хүсч байна гэж төсөөлөөд үз дээ. Далай дээр бүх замууд байдаг бөгөөд хэрвээ та энэ нь хэрхэн оршдогийг мэддэг бол хамгийн дөт замаар явах боломжтой. Манай тохиолдолд хамгийн богино зам нь хоёр портын зэрэгцээ байрладаг гэж бодох нь зүйн хэрэг юм: газрын зураг дээр энэ нь шулуун шугам бөгөөд шулуун замаас богино байх нь юу вэ! Гэхдээ бид андуурч байна: параллель дагуух зам нь хамгийн богино биш юм.

    Үнэн хэрэгтээ: бөмбөрцгийн гадаргуу дээр хоёр цэгийн хоорондох хамгийн богино зай нь тэдгээрийг холбосон том тойргийн нум юм. Гэхдээ зэрэгцээ тойрог жижиг тойрог. Том тойргийн нум нь ижил хоёр цэгээр татсан жижиг тойргийн нумаас бага муруйтай: том радиус нь жижиг муруйлттай тохирч байна. Бидний хоёр цэгийн хоорондох бөмбөрцөг дээрх утсыг татах (3-р зургийг үзнэ үү); Энэ нь параллель дагуу огт хэвтэхгүй байгаа эсэхийг шалгах болно. Нягт утас - маргаангүй заагч хамгийн богино зам, мөн хэрэв энэ нь дэлхийн бөмбөрцөг дээрх параллельтэй давхцахгүй бол далайн график дээр хамгийн богино замыг шулуун шугамаар заагаагүй: ийм газрын зураг дээр параллель тойргийг шулуун шугамаар дүрсэлсэн байдаг гэдгийг санаарай. шулуун шугамтай давхцахгүй байна муруй .



    Цагаан будаа. 3. Хоёр цэгийн хоорондох хамгийн богино замыг олох энгийн арга: та эдгээр цэгүүдийн хооронд бөмбөрцөгт утас татах хэрэгтэй.


    Энэ хэлсний дараа далайн зурган дээрх хамгийн дөт замыг яагаад шулуун биш, харин муруй шугамаар дүрсэлсэн нь тодорхой болно.

    Николаевская (одоо Октябрская) чиглэлээ сонгохдоо тэд хэлдэг. төмөр замямар замаар тавих талаар эцэс төгсгөлгүй маргаан байсан. Асуудлыг шууд утгаараа "шууд" шийдсэн хаан Николай I-ийн оролцоотойгоор маргаан эцэслэв: тэрээр Санкт-Петербургийг Москватай шугамын дагуу холбосон. Хэрэв энэ нь Меркаторын газрын зураг дээр хийгдсэн бол энэ нь ичмээр гэнэтийн зүйл байх байсан: шулуун шугамын оронд зам муруй байх байсан.

    Тооцоолол хийхээс зайлсхийдэггүй хэн бүхэн газрын зураг дээр муруй мэт санагдах зам нь бидний шулуун гэж үзэхэд бэлэн байгаа замаас богино байдаг гэдгийг энгийн тооцоогоор баталж чадна. Манай хоёр боомт 60-р параллель дээр хэвтэж, 60°-ийн зайтай байг. (Ийм хоёр боомт үнэхээр байгаа эсэх нь мэдээжийн хэрэг тооцоолоход чухал биш юм.)



    Цагаан будаа. 4. Бөмбөг дээрх параллель нумын дагуу болон их тойргийн нумын дагуух А ба В цэгүүдийн хоорондох зайг тооцоолоход.


    Зураг дээр. 4 оноо О -төв бөмбөрцөг, AB -боомтууд байрладаг өргөргийн тойргийн нум А ба Б; inтүүний 60 °. Өргөргийн тойргийн төв нь нэг цэг дээр байна FROMҮүнийг төвөөс төсөөлөөд үз дээ ОДэлхийн бөмбөрцгийг ижил боомтуудын дундуур том тойрог нум татдаг: түүний радиус OB = OA = R;энэ нь зурсан нумын ойролцоо өнгөрөх болно AB,гэхдээ таарахгүй байна.

    Нуман бүрийн уртыг тооцоолъё. Онооноос хойш ГЭХДЭЭболон AT 60° өргөрөгт хэвтэж, дараа нь радиус О.Аболон О.Втэй эвлэрэх OS(бөмбөрцгийн тэнхлэг) 30° өнцөг. Тэгш өнцөгт гурвалжинд ASOхөл AC (=r), 30 ° өнцгийн эсрэг байрлах нь гипотенузын хагастай тэнцүү байна ХК;

    гэсэн үг, r=R/2Нуман урт ABнь өргөргийн тойргийн уртын зургааны нэг бөгөөд энэ тойрог нь том тойргийн уртын хагастай (радиусын хагастай тохирч байгаа) учир жижиг тойргийн нумын урт



    Ижил цэгүүдийн хооронд зурсан том тойргийн нумын уртыг (өөрөөр хэлбэл тэдгээрийн хоорондох хамгийн богино замыг) тодорхойлохын тулд бид өнцгийн хэмжээг мэдэх хэрэгтэй. AOW.Аккорд AS, нумыг 60 ° (жижиг тойрог) хасах нь ижил жижиг тойрогт бичээстэй ердийн зургаан өнцөгтийн тал юм; тийм учраас AB \u003d r \u003d R / 2

    Шулуун шугам зурах od,холбох төв Одунд хэсэгтэй бөмбөрцөг Дхөвч AB,тэгш өнцөгт гурвалжин авах ODA,өнцөг хаана байна D-Чигээрээ:

    DA= 1/2 AB ба OA=R.

    sinAOD=AD: AO=R/4:R=0.25

    Эндээс бид (хүснэгтийн дагуу):

    =14°28",5

    мөн иймээс

    = 28°57".

    Одоо хамгийн богино замын хүссэн уртыг километрээр олоход хэцүү биш юм. Хэрэв бид дэлхийн бөмбөрцгийн том тойргийн нэг минутын урт гэдгийг санаж байвал тооцооллыг хялбарчилж болно.

    Далайн график дээр шулуун шугамаар харуулсан өргөргийн тойрог дагуух зам нь 3333 км, газрын зураг дээрх муруйн дагуух том тойрог дагуух зам нь 3213 км, өөрөөр хэлбэл 120 км богино гэдгийг бид мэдэж байна.

    Утасаар зэвсэглэсэн, гартаа бөмбөрцөг байгаа тул та бидний зургийн зөв эсэхийг хялбархан шалгаж, том тойргийн нумууд үнэхээр зурагт үзүүлсэн шиг хэвтэж байгаа эсэхийг шалгах боломжтой. Зурагт үзүүлэв. Африк тивээс Австрали хүртэлх "шулуун" далайн зам нь 6020 миль, "муруй" нь 5450 миль, өөрөөр хэлбэл 570 миль буюу 1050 км-ээр богино байдаг. Лондонгоос Шанхай хүртэлх далайн график дээрх "шууд" агаарын зам нь Каспийн тэнгисээр дамждаг бол хамгийн дөт зам нь Санкт-Петербургийн хойд хэсэгт оршдог. Эдгээр асуудал нь цаг хугацаа, шатахуун хэмнэхэд ямар үүрэг гүйцэтгэх нь ойлгомжтой.

    Хэрэв дарвуулт онгоцны эрин үед тээврийн цаг үргэлж үнэлэгддэггүй байсан бол "цаг" нь "мөнгө" гэж хараахан тооцогдоогүй байсан бол уурын хөлөг онгоц гарч ирснээр илүү их зарцуулсан нүүрсний тонн тутамд төлөх шаардлагатай болдог. Тийм ч учраас өнөөдөр хөлөг онгоцууд үнэхээр хамгийн дөт замаар явж байгаа бөгөөд ихэнхдээ Меркатор дээр биш, харин "төв" проекц гэж нэрлэгддэг газрын зургийг ашигладаг: эдгээр газрын зураг дээр том тойргийн нумуудыг шулуун шугамаар дүрсэлсэн байдаг.

    Тэгвэл яагаад хуучин залуурчид ийм хуурамч газрын зураг ашиглаж, таагүй замыг сонгосон юм бэ? Эрт дээр үед тэд далайн графикуудын одоо заасан шинж чанарыг мэддэггүй байсан гэж бодох нь эндүүрэл юм. Мэдээжийн хэрэг үүгээр биш, харин Меркаторын аргын дагуу зурсан графикууд нь далайчдад маш их ашиг тустай байдагтай холбоотой юм. Ийм газрын зураг нь нэгдүгээрт, дэлхийн гадаргуугийн салангид жижиг хэсгүүдийг гажуудалгүйгээр дүрсэлж, контурын булангуудыг хадгалдаг. Энэ нь экватороос хол байх тусам бүх контурууд мэдэгдэхүйц сунадагтай зөрчилддөггүй. Өндөр өргөрөгт сунах нь маш их ач холбогдолтой тул далайн график нь түүний онцлог шинж чанарыг мэдэхгүй хүмүүст тивүүдийн жинхэнэ хэмжээний талаар огт худал төсөөлөлд өдөөдөг: Гренланд нь Африктай ижил хэмжээтэй юм шиг санагддаг. Аляск Австралиас том боловч Гренланд нь Африк тивээс 15 дахин жижиг, Аляск Гренландтай хамт Австралийн тал талбайтай. Гэхдээ хүснэгтийн эдгээр шинж чанаруудыг сайн мэддэг далайчин тэднийг төөрөгдүүлж чадахгүй. Тэр тэднийг тэсвэрлэдэг, ялангуяа жижиг газар нутагт далайн зураг нь байгалийн яг ижил төстэй байдлыг өгдөг (Зураг 5).

    Нөгөөтэйгүүр, далайн зураг нь навигацийн практикийн даалгаврыг шийдвэрлэхэд ихээхэн тусалдаг. Энэ бол байнгын урсгалтай хөлөг онгоцны замыг шулуун шугамаар дүрсэлсэн цорын ганц төрлийн график юм. "Тогтмол зам"-ыг дагах гэдэг нь нэг чиглэл, нэг тодорхой "румб"-ыг байнга барьж, өөрөөр хэлбэл бүх голчидыг тэгш өнцөгт гатлах замаар явахыг хэлнэ. Гэхдээ энэ замыг ("локодром") зөвхөн бүх меридианууд нь хоорондоо параллель шулуун шугамууд байдаг газрын зураг дээр шулуун шугамаар дүрсэлж болно. Бөмбөрцөг дээр өргөргийн тойрог нь меридиануудтай зөв өнцгөөр огтлолцдог тул ийм газрын зураг дээр өргөргийн тойрог нь меридиануудын шугамтай перпендикуляр шулуун шугам байх ёстой. Товчхондоо, бид далайн графикийн онцлог шинжийг бүрдүүлдэг координатын сүлжээнд яг хүрч ирдэг.




    Цагаан будаа. 5. Дэлхийн бөмбөрцгийн Далайн буюу Меркаторын газрын зураг. Ийм газрын зураг дээр экватороос алслагдсан контурын хэмжээсийг хэтрүүлсэн байдаг. Жишээлбэл, аль нь том вэ: Гренланд уу, Австрали уу? (текстээр хариулах)


    Далайчдын Меркаторын газрын зургийг илүүд үзэх нь одоо ойлгомжтой болсон. Зориулалтын боомт руу явахдаа явах чиглэлийг тодорхойлохыг хүсч, навигатор замын төгсгөлийн цэгүүдэд захирагчийг хэрэглэж, меридиануудтай хийсэн өнцгийг хэмждэг. Энэ чиглэлд үргэлж нээлттэй далайд байх тул залуур хөлөг онгоцыг зорилтот газарт нь үнэн зөв авчрах болно. "Локсодром" нь хамгийн богино, хамгийн хэмнэлттэй биш боловч далайчинд маш тохиромжтой арга гэдгийг та харж байна. Жишээ нь, Сайн найдварын хошуунаас Австралийн өмнөд үзүүр хүртэл (1-р зургийг үз) хүрэхийн тулд үргэлж ижил чиглэлтэй S 87 °.50 " байх ёстой. Үүний зэрэгцээ, хөлөг онгоцыг ижил чиглэлд хүргэхийн тулд. эцсийн цэг хамгийн богино зам("ортодроми" -ын дагуу) зурагнаас харахад хөлөг онгоцны чиглэлийг тасралтгүй өөрчлөх шаардлагатай: S 42 °, 50 " курсээс эхэлж, N 53 °, 50 курсээр төгсөнө. "(энэ тохиолдолд хамгийн дөт зам нь бүр боломжгүй - энэ нь Антарктидын мөсөн хананд наалддаг).

    "Локсодром" ба "ортодроми" дагуух хоёр зам хоёулаа давхцдаг бөгөөд зөвхөн том тойрог дагуух замыг далайн зурган дээр шулуун шугамаар дүрсэлсэн үед: экваторын дагуу эсвэл голтын дагуу хөдөлж байх үед. Бусад бүх тохиолдолд эдгээр замууд өөр өөр байдаг.

    Дийкстрагийн алгоритм нь 1959 онд Голландын эрдэмтэн Эдгер Дийкстрагийн зохион бүтээсэн график алгоритм юм. Графикийн аль нэг оройноос бусад бүх цэг хүртэлх хамгийн богино замыг олно. Алгоритм ажилладаг зөвхөн сөрөг жинтэй ирмэггүй графикуудын хувьд.

    Зурагт үзүүлсэн графикийн жишээн дээр алгоритмын гүйцэтгэлийг авч үзье.

    1-р оройгоос бусад бүх цэг хүртэлх хамгийн богино зайг олох шаардлагатай.

    Тойрог нь оройг, шугамууд нь тэдгээрийн хоорондох замыг (графикийн ирмэг) заана. Оройнуудын тоог тойрог дээр, тэдгээрийн "үнэ" - замын уртыг ирмэг дээр нь зааж өгсөн болно. Орой бүрийн хажууд улаан шошго тэмдэглэгдсэн байдаг - 1-р оройноос энэ орой руу хүрэх хамгийн богино замын урт.

    Эхний алхам. Бидний жишээн дээр Дижкстрагийн алгоритмын нэг алхамыг авч үзье. 1-р орой нь хамгийн бага шошготой. 2, 3, 6-р орой нь түүний хөршүүд юм.

    1-р оройн эхний хөрш нь эргээд 2-р орой юм, учир нь түүнд хүрэх замын урт хамгийн бага байдаг. 1-р оройгоор дамжин өнгөрөх замын урт нь 1-р оройны шошгоны утга ба 1-ээс 2-р хүртэлх ирмэгийн уртын нийлбэртэй тэнцүү, өөрөөр хэлбэл 0 + 7 = 7. Энэ нь 2-р оройн одоогийн шошго, хязгааргүй тул 2-р оройн шинэ шошго 7 байна.

    Бид ижил төстэй ажиллагааг 1-р оройн бусад хоёр хөрш - 3, 6-р хийдэг.

    1-р зангилааны бүх хөршийг шалгана. Оргил 1 хүртэлх одоогийн хамгийн бага зай нь эцсийнх гэж тооцогддог бөгөөд дахин хянан үзэх боломжгүй (энэ нь үнэхээр хэрэг гэдгийг анх Э. Дийкстра нотолсон). Графикаас гаталж энэ орой руу очсоныг тэмдэглэнэ үү.

    Хоёр дахь алхам. Алгоритмын алхам давтагдана. Дахин бид зочилдоггүй оройнуудын "хамгийн ойр"-ыг олдог. Энэ нь 7 гэсэн шошготой 2-р орой юм.

    Дахин бид сонгосон оройн хөршүүдийн шошгыг багасгахыг оролдож, 2-р оройгоор дамжин өнгөрөхийг оролддог. 2-р оройн хөршүүд нь 1, 3, 4-р оройнууд юм.

    2-р оройн эхний (дараалал) хөрш нь орой 1. Гэхдээ энэ нь аль хэдийн зочилсон тул бид 1-р орой дээр юу ч хийхгүй.

    2-р оройн дараагийн хөрш нь оройнуудын хамгийн бага шошгыг зочлоогүй гэж тэмдэглэсэн тул 3-р орой юм. Хэрэв та 2-оор дамжин өнгөрөх юм бол ийм замын урт нь 17 (7 + 10 = 17) болно. Харин гурав дахь оройн одоогийн шошго нь 9 буюу 17-оос бага тул шошго нь өөрчлөгддөггүй.

    2-р оройн өөр нэг хөрш нь 4-р орой юм. Хэрэв та 2-р дундуур явах юм бол ийм замын урт нь 2-р орой хүртэлх хамгийн богино зай ба 2 ба 4-р оройн хоорондох зайны нийлбэртэй тэнцүү байх болно. , 22 (7 + 15 = 22) . 22-оос хойш<, устанавливаем метку вершины 4 равной 22.

    Орой 2-ын бүх хөршүүдийг үзсэн тул бид түүнд хүрэх зайг царцааж, зочилсон гэж тэмдэглэв.

    Гурав дахь алхам. Бид алгоритмын алхамыг 3-р оройг сонгон давтан хийнэ. "боловсруулсны" дараа бид дараах үр дүнг авна.

    Дараагийн алхмууд. Бид үлдсэн оройнуудын хувьд алгоритмын алхамыг давтана. Эдгээр нь 6, 4, 5-р оройнууд байх болно.

    Алгоритмын гүйцэтгэлийг дуусгах. Дахиж оройг боловсруулах боломжгүй үед алгоритм дуусна. Энэ жишээн дээр бүх оройг зурсан боловч ямар ч жишээнд ийм байх болно гэж таамаглах нь алдаа юм - хэрэв тэдгээрт хүрч чадахгүй бол, өөрөөр хэлбэл график салгагдсан тохиолдолд зарим оройнууд нь огтлолтгүй үлдэж болно. Алгоритмын үр дүн сүүлийн зураг дээр харагдаж байна: 1-р оройноос 2 хүртэлх хамгийн богино зам нь 7, 3-аас 9, 4-өөс 20 хүртэл, 5-аас 20 хүртэл, 6 хүртэл 11 байна.

    Төрөл бүрийн програмчлалын хэл дээр алгоритмыг хэрэгжүүлэх:

    C++

    #include "stdafx.h" #include namespace std ашиглах; const int V=6; // Dijkstra-ийн алгоритм хүчингүй болсон Dijkstra(int GR[V][V], int st) ( int distance[V], count, index, i, u, m=st+1; bool visited[V]; for (i=) 0 i "< "<> "; cin>>start; Dijkstra(GR, start-1); system("pause>>void"); )

    Паскаль

    програм DijkstraAlgorithm; usescrt; constV=6; inf=100000; төрөл вектор=бүхэл тоон массив; var start: бүхэл тоо; const GR: бүхэл тоон массив=((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)); (Dijkstra-ийн алгоритм) процедур Dijkstra(GR: array of integer; st: integer); var count, index, i, u, m, min: бүхэл тоо; зай: вектор; зочилсон: boolean массив; startm:=st; i:=1-ээс V хүртэл эхлэх зай[i]:=inf; зочилсон[i]:=худал; Төгсгөл; зай:=0; for count:=1 to V-1 do start min:=inf; i:=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 inf дараа нь writeln(m," > ", i," = ", зай[i]) else writeln(m," > ", i," = ", "маршрут боломжгүй"); Төгсгөл; (програмын үндсэн блок) эхлэх clrscr; write("Эхлэх зангилаа >> "); унших (эхлэх); Dijkstra(GR, эхлэл); Төгсгөл.

    Java

    java.io.BufferedReader-г импортлох; java.io.IOException импортлох; java.io.InputStreamReader-г импортлох; java.io.PrintWriter импортлох; java.util.ArrayList импортлох; java.util.Arrays импортлох; java.util.StringTokenizer импортлох; нийтийн анги Шийдэл ( private static int INF = Integer.MAX_VALUE / 2; private int n; //digraph дахь оройн тоо private int m; //digraph хувийн ArrayList дахь нумын тоо adj; //зэргэлдээх жагсаалт хувийн ArrayList жин; //диграф дахь ирмэгийн жинг хувийн логик ашигласан; //дамсан болон даваагүй оргилуудын талаарх мэдээллийг хадгалах массив private int dist; //эхлэх орой хүртэлх зайг хадгалах массив //эхлэх оройноос хамгийн богино замыг сэргээхэд шаардлагатай өвөг дээдсийн массив private int pred; int эхлэл; //эхлэх оройгоос бусад бүх хүртэлх зайг хайж олох хувийн BufferedReader cin; хувийн PrintWriter cout; хувийн StringTokenizer токенизатор; //Дайкстрагийн алгоритмыг эхлэлийн оройноос эхлүүлэх журам private void dejkstra(int s) ( dist[s] = 0; //эхлэх орой хүртэлх хамгийн богино зай нь 0 (int iter = 0; iter)< n; ++iter) { int v = -1; int distV = INF; //выбираем вершину, кратчайшее расстояние до которого еще не найдено for (int i = 0; i < n; ++i) { if (used[i]) { continue; } if (distV < dist[i]) { continue; } v = i; distV = dist[i]; } //рассматриваем все дуги, исходящие из найденной вершины for (int i = 0; i < adj[v].size(); ++i) { int u = adj[v].get(i); int weightU = weight[v].get(i); //релаксация вершины if (dist[v] + weightU < dist[u]) { dist[u] = dist[v] + weightU; pred[u] = v; } } //помечаем вершину v просмотренной, до нее найдено кратчайшее расстояние used[v] = true; } } //процедура считывания входных данных с консоли private void readData() throws IOException { cin = new BufferedReader(new InputStreamReader(System.in)); cout = new PrintWriter(System.out); tokenizer = new StringTokenizer(cin.readLine()); n = Integer.parseInt(tokenizer.nextToken()); //считываем количество вершин графа m = Integer.parseInt(tokenizer.nextToken()); //считываем количество ребер графа start = Integer.parseInt(tokenizer.nextToken()) - 1; //инициализируем списка смежности графа размерности n adj = new ArrayList[n]; for (int i = 0; i < n; ++i) { adj[i] = new ArrayList(); ) //ирмэгийн жингийн жинг хадгалдаг жагсаалтыг эхлүүлэх = шинэ ArrayList[n]; хувьд (int i = 0; i< n; ++i) { weight[i] = new ArrayList(); ) // (int i = 0; i) ирмэгүүдийн жагсаалтаас өгөгдсөн графикийг уншина уу< m; ++i) { tokenizer = new StringTokenizer(cin.readLine()); int u = Integer.parseInt(tokenizer.nextToken()); int v = Integer.parseInt(tokenizer.nextToken()); int w = Integer.parseInt(tokenizer.nextToken()); u--; v--; adj[u].add(v); weight[u].add(w); } used = new boolean[n]; Arrays.fill(used, false); pred = new int[n]; Arrays.fill(pred, -1); dist = new int[n]; Arrays.fill(dist, INF); } //процедура восстановления кратчайшего пути по массиву предком void printWay(int v) { if (v == -1) { return; } printWay(pred[v]); cout.print((v + 1) + " "); } //процедура вывода данных в консоль private void printData() throws IOException { for (int v = 0; v < n; ++v) { if (dist[v] != INF) { cout.print(dist[v] + " "); } else { cout.print("-1 "); } } cout.println(); for (int v = 0; v < n; ++v) { cout.print((v + 1) + ": "); if (dist[v] != INF) { printWay(v); } cout.println(); } cin.close(); cout.close(); } private void run() throws IOException { readData(); dejkstra(start); printData(); cin.close(); cout.close(); } public static void main(String args) throws IOException { Solution solution = new Solution(); solution.run(); } }

    Өөр нэг сонголт:

    java.io.* импортлох; java.util.* импортлох; public class Dijkstra ( private static final Graph.Edge GRAPH = ( new Graph.Edge("a", "b", 7), new 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), ); хувийн статик эцсийн мөр START = "a"; хувийн статик эцсийн мөр END = "e"; нийтийн статик хүчингүй үндсэн(String args) ( График g = шинэ График(GRAPH); g.dijkstra (START); g.printPath(END); //g.printAllPaths(); ) ) анги График (хувийн эцсийн газрын зураг) график; // Edge-ийн багцаас бүтээгдсэн оройн нэрийг оройн объект руу буулгах /** Графикийн нэг ирмэг (зөвхөн График бүтээгч ашигладаг) */ public static class Edge ( public final String v1, v2; public final int dist; public Edge(String v1, String v2, int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** Графикийн нэг орой, хөрш зэргэлдээ оройнуудын зураглалыг гүйцээнэ */ public static class Vertex хэрэгжүүлэгчид Comparable ( нийтийн эцсийн тэмдэгт мөрийн нэр; нийтийн int dist = бүхэл тоо.MAX_VALUE; // MAX_VALUE нь хязгааргүй нийтийн оройн орой = null; нийтийн эцсийн газрын зураг хөршүүд = шинэ HashMap<>(); public Vertex(String name) ( this.name = name; ) private void printPath() ( if (энэ == this.previous) ( System.out.printf("%s", this.name); ) other if ( this.previous == null) ( System.out.printf("%s(хүрээгүй)", this.name); ) else ( this.previous.printPath(); System.out.printf(" -> %s(" %d)", this.name, this.dist); ) ) public int compareTo(Vertex other) ( return Integer.compare(dist, other.dist); ) ) /** Ирмэгүүдийн багцаас график байгуулна * / public Graph(Idge edges) ( график = шинэ HashMap<>(ирмэг.урт); //(Edge e: edges) ( if (!graph.containsKey(e.v1)) graph.put(e.v1, new Vertex(e.v1)); if (!graph. containKey(e.v2)) graph.put(e.v2, new Vertex(e.v2)); ) //(Edge e: edges) ( graph.get(e.v1))-ийн хөрш оройг тохируулах өөр нэг дамжуулалт. neighbours.put(graph.get(e.v2), e.dist); //graph.get(e.v2).neighbours.put(graph.get(e.v1), e.dist); // мөн чиглүүлээгүй графикийн хувьд үүнийг хий ) ) /** Заасан эх сурвалжийн оройг ашиглан dijkstra-г ажиллуулна */ public void dijkstra(String startName) ( if (!graph.containsKey(startName)) ( System.err.printf("График ажиллахгүй байна) Эхлэх оройг агуулсан \"%s\"\n", startName); буцах; ) эцсийн оройн эх үүсвэр = graph.get(startName); NavigableSet q = шинэ TreeSet<>(); // (Орой v: graph.values()) ( v.previous = v == эх ? эх: null; v.dist = v == эх ? 0: Бүхэл тоо.MAX_VALUE; q.add()-ийн оройг тохируулах v); ) dijkstra(q); ) /** Хоёртын овоо ашиглан dijkstra-ийн алгоритмыг хэрэгжүүлэх. */ private void dijkstra(final NavigableSet) q) ( Vertex u, v; while (!q.isEmpty()) ( u = q.pollFirst(); // хамгийн богино зайтай орой (эхний давталт нь эх сурвалжийг буцаана) хэрэв (u.dist == Integer.MAX_VALUE) завсарлага; // бид u (болон бусад бүх оройнуудыг) үл тоомсорлож болно, учир нь тэдгээрт хүрэх боломжгүй // хөрш бүрийн зайг хар (Map.Entry) a: u.neighbours.entrySet()) ( v = a.getKey(); //энэ давталтын хөрш эцсийн int alternateDist = u.dist + a.getValue(); if (alternateDist)< v.dist) { // shorter path to neighbour found q.remove(v); v.dist = alternateDist; v.previous = u; q.add(v); } } } } /** Prints a path from the source to the specified vertex */ public void printPath(String endName) { if (!graph.containsKey(endName)) { System.err.printf("Graph doesn"t contain end vertex \"%s\"\n", endName); return; } graph.get(endName).printPath(); System.out.println(); } /** Prints the path from the source to every vertex (output order is not guaranteed) */ public void printAllPaths() { for (Vertex v: graph.values()) { v.printPath(); System.out.println(); } } }

    C

    #оруулна #оруулна #оруулна //#тогтоох BIG_EXAMPLE typedef struct node_t node_t, *heap_t; typedef struct edge_t edge_t; struct edge_t ( node_t *nd; /* энэ ирмэгийн зорилт */ edge_t *ах дүү;/* дангаар холбогдсон жагсаалтын хувьд */ int len; /* захын зардал */ ); struct node_t ( edge_t *ирмэг; /* дангаар нь холбосон ирмэгүүдийн жагсаалт */ node_t *via; /* өмнөх зангилаа хамгийн богино замд байгаа бол */ давхар дист; /* эхлэл зангилаанаас хол зай */ тэмдэгтийн нэр; /* the, er , нэр */ int heap_idx; /* зайг шинэчлэхийн тулд овоолгын байрлал руу холбох */ ); /* --- захын менежмент --- */ #ifdef BIG_EXAMPLE # BLOCK_SIZE-г тодорхойлох (1024 * 32 - 1) #else # BLOCK_SIZE-г тодорхойлох 15 #endif edge_t *edge_root = 0, *e_next = 0; /* Санах ойн менежментийн талаар санаа зовох хэрэггүй, тэдгээр нь гол зүйл биш юм.Ptend e_next = malloc(sizeof(edge_t)) */ void add_edge(node_t *a, node_t *b, double d) ( if (e_next == edge_root) ) ( edge_root = malloc(sizeof(edge_t) * (BLOCK_SIZE + 1)); edge_root.sibling = e_next; e_next = edge_root + BLOCK_SIZE; ) --e_next; e_next->nd = b; e_next->ext = d; e_next ->ах дүү = a->ирмэг; a->ирмэг = e_next; ) void free_edges() ( for (; edge_root; edge_root = e_next) ( e_next = edge_root.sibling; free(edge_root); ) ) /* --- тэргүүлэх дарааллын зүйлс --- */ heap_t *нугас; int heap_len; void set_dist(node_t *nd, node_t *wia, double d) ( int i, j; /* аль хэдийн илүү сайн замыг мэдэж байсан */ хэрэв (nd-> && дамжуулан) d >= nd->dist) буцах; /* байгаа овоолгын оруулгыг олох, эсвэл шинээр үүсгэх */ nd->dist = d; nd->via = via; i = nd->heap_idx; хэрэв (!i) i = ++heap_len; /* upheap */ (; i > 1 && nd->dist)< heap->dist; i = j) ( нуруулдан[i] = нуруулдан[j])-> нуруулдан_idx = i; овоо[i] = nd; nd->heap_idx = i; ) node_t * pop_queue() ( node_t *nd, *tmp; int i, j; хэрэв (!heap_len) 0-г буцаана; /* тэргүүлэх элементийг устгаад сүүлний элементийг тэнд татаж аваад */ nd = овоо; tmp = нуруулдан; хувьд (i = 1; i< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > heap->dist) j++; if (heap[j]->dist >= tmp->dist) таслах; (нугас[i] = нуруулдан[j])-> нуруулдан_idx = i; ) нуруулдан[i] = tmp; tmp->heap_idx = i; буцах nd; ) /* --- Dijkstra материал; хүрч чадахгүй зангилаа хэзээ ч үүсгэхгүй руудараалал --- */ хүчингүй болгох calc_all(node_t *эхлэх) ( node_t *lead; edge_t *e; set_dist(эхлэх, эхлэх, 0); while ((e = lead->edge) хувьд ((хар тугалга = pop_queue())); e; e = e->ах дүү) set_dist(e->nd, lead, lead->dist + e->len); ) void show_path(зангилаа_t *nd) ( if (nd->via == nd) printf( "%s", nd->name); else if (!nd->via) printf("%s(хүрээгүй)", nd->name); else ( show_path(nd->via); printf("- > %s(%g) ", nd->name, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # N_NODES ("f" - "a" + 1) зангилаа_t * тодорхойлох зангилаа = calloc(хэмжээ(зангилаа_t), N_NODES); хувьд (i = 0; i)< N_NODES; i++) sprintf(nodes[i].name, "%c", "a" + i); # define E(a, b, c) add_edge(nodes + (a - "a"), nodes + (b - "a"), c) E("a", "b", 7); E("a", "c", 9); E("a", "f", 14); E("b", "c", 10);E("b", "d", 15);E("c", "d", 11); E("c", "f", 2); E("d", "e", 6); E("e", "f", 9); # undef E #else /* BIG_EXAMPLE */ int i, j, c; # define N_NODES 4000 node_t *nodes = calloc(sizeof(node_t), N_NODES); for (i = 0; i < N_NODES; i++) sprintf(nodes[i].name, "%d", i + 1); /* given any pair of nodes, there"s about 50% chance they are not connected; if connected, the cost is randomly chosen between 0 and 49 (inclusive! see output for consequences) */ for (i = 0; i < N_NODES; i++) { for (j = 0; j < N_NODES; j++) { /* majority of runtime is actually spent here */ if (i == j) continue; c = rand() % 100; if (c < 50) continue; add_edge(nodes + i, nodes + j, c - 50); } } #endif heap = calloc(sizeof(heap_t), N_NODES + 1); heap_len = 0; calc_all(nodes); for (i = 0; i < N_NODES; i++) { show_path(nodes + i); putchar("\n"); } #if 0 /* real programmers don"t free memories (they use Fortran) */ free_edges(); free(heap); free(nodes); #endif return 0; }

    PHP

    $edge, "зардал" => $edge); $neighbours[$edge] = массив("төгсгөл" => $edge, "зардал" => $edge); ) $ оройнууд = массив_өвөрмөц ($ оройнууд); foreach ($ оройг $ орой) ( $dist[$vertex] = INF; $өмнөх[$vertex] = NULL; ) $dist[$source] = 0; $Q = $ орой; while (count($Q) > 0) ( // TODO - Хамгийн багадаа $min = INF авах хурдан арга олох; foreach ($Q-г $vertex)( if ($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";


    Python

    цуглуулгаас импортын нэрлэсэн tuple, дараалал нь pprint-аас импортын pprint in pp хэлбэрээр inf = float("inf") Edge = nametuple("Edge", "start, end, cost") class Graph(): def __init__(self, edges): self .edges = edges2 = self.vertices = set(((e for e in edges2), )) def dijkstra(self, source, dest): assert source in self.vertices dist = (vertex: self.vertices дахь оройн хувьд inf ) өмнөх = (орой: self.vertices дахь оройн хувьд байхгүй) dist = 0 q = self.vertices.copy() хөршүүд = (орой: set() self.vertices дахь оройн) эхлэл, төгсгөл, өөрөө зардал. ирмэгүүд: хөршүүд.add((төгсгөл, зардал)) #pp(хөршүүд) байхад q: u = min(q, түлхүүр=ламбда орой: dist) q.remove(u) хэрэв dist[u] == inf эсвэл u = = dest: v-ийн завсарлага, хөршүүдийн зардал[u]: alt = 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"]