• Ikki nuqta orasidagi eng qisqa masofa. Bilasizmi, nima uchun u yoydan ko'ra to'g'ri chiziqda joylashgan? Ikki kesishuvchi chiziq orasidagi masofani aniqlash

    01.02.2022

    Doskada ikkita nuqtani bo'r bilan belgilab, o'qituvchi yosh talabaga vazifani taklif qiladi: ikkala nuqta orasidagi eng qisqa yo'lni chizish.

    Talaba o'ylab ko'rgandan so'ng, ular orasiga qunt bilan o'ralgan chiziq chizadi.

    - Bu eng qisqa yo'l! o'qituvchi hayron bo'ladi. - Buni sizga kim o'rgatgan?

    - Dadam. U taksi haydovchisi.

    Sodda maktab o'quvchisining chizgan rasmi, albatta, anekdotdir, lekin agar sizga anjirdagi nuqta yoy deb aytishsa, tabassum qilmaysizmi? 1 - Yaxshi Umid burnidan Avstraliyaning janubiy uchigacha bo'lgan eng qisqa yo'l!

    Quyidagi bayonot yanada hayratlanarli: rasmda tasvirlangan. Yaponiyadan Panama kanaligacha bo'lgan ikki yo'l bitta xaritada ular o'rtasida chizilgan to'g'ri chiziqdan qisqaroq!

    Guruch. 1. Dengiz xaritasida Umid burnidan Avstraliyaning janubiy uchigacha boʻlgan eng qisqa yoʻl toʻgʻri chiziq (“loksodrom”) bilan emas, balki egri chiziq (“orthodromiya”) bilan koʻrsatilgan.


    Bularning barchasi hazilga o'xshaydi, lekin ayni paytda sizning oldingizda kartograflarga yaxshi ma'lum bo'lgan shubhasiz haqiqatlar mavjud.




    Guruch. 2. Dengiz xaritasidagi Yokogamani Panama kanali bilan bog‘lovchi egri chiziq xuddi shu nuqtalar orasiga chizilgan to‘g‘ri chiziqdan qisqaroq ekanligi aql bovar qilmaydigan ko‘rinadi.


    Masalani oydinlashtirish uchun umumiy jadvallar va xususan dengiz xaritalari haqida bir necha so'z aytish kerak bo'ladi. Er yuzasining qismlarini qog'ozga chizish hatto printsipial jihatdan ham oson ish emas, chunki Yer shar shaklida bo'lib, ma'lumki, sferik sirtning biron bir qismini burmalar va sinishlarsiz tekislikda joylashtirish mumkin emas. Beixtiyor xaritalardagi muqarrar buzilishlarga chidashga to‘g‘ri keladi. Xaritalarni chizishning ko'plab usullari ixtiro qilingan, ammo barcha xaritalar kamchiliklardan xoli emas: ba'zilarida bir turdagi buzilishlar mavjud, boshqalari esa boshqa turdagi, lekin buzilmagan xaritalar umuman yo'q.

    Dengizchilar 16-asrning eski golland kartografi va matematiki usuli bo'yicha chizilgan xaritalardan foydalanadilar. Merkator. Bu usul Merkator proyeksiyasi deb ataladi. Dengiz xaritasini to'rtburchaklar panjarasi orqali tanib olish oson: unda meridianlar bir qator parallel to'g'ri chiziqlar sifatida ko'rsatilgan; kenglik doiralari - birinchisiga perpendikulyar to'g'ri chiziqlarda ham (5-rasmga qarang).

    Tasavvur qiling-a, siz bir okean portidan boshqasiga bir xil parallel bo'lgan eng qisqa yo'lni topmoqchisiz. Okeanda barcha yo'llar mavjud va agar u qanday yotishini bilsangiz, eng qisqa yo'l bo'ylab sayohat qilish har doim mumkin. Bizning holatda, eng qisqa yo'l ikkala port yotadigan parallel bo'ylab ketadi, deb o'ylash tabiiydir: axir, xaritada bu to'g'ri chiziq va to'g'ri yo'ldan qisqaroq nima bo'lishi mumkin! Ammo biz yanglishamiz: parallel bo'ylab yo'l eng qisqa emas.

    Haqiqatan ham: sharning yuzasida ikkita nuqta orasidagi eng qisqa masofa ularni bog'laydigan katta doira yoyidir. Ammo parallel doira kichik doira. Katta aylananing yoyi bir xil ikkita nuqta orqali o'tkazilgan har qanday kichik aylana yoyidan kamroq kavisli: kattaroq radius kichikroq egrilikka mos keladi. Ikki nuqtamiz orasiga globusdagi ipni torting (3-rasmga qarang); u umuman parallel bo'ylab yotmasligiga ishonch hosil qilasiz. Cho'zilgan ip eng qisqa yo'lning shubhasiz ko'rsatkichidir va agar u globusdagi parallelga to'g'ri kelmasa, dengiz xaritasida eng qisqa yo'l to'g'ri chiziq bilan ko'rsatilmagan: esda tutingki, parallellar doiralari shunday tasvirlangan. to'g'ri chiziqlar bilan xarita, to'g'ri chiziq bilan mos kelmaydigan har qanday chiziq , ovqatlaning egri chiziq .



    Guruch. 3. Ikki nuqta orasidagi haqiqatan ham eng qisqa yo‘lni topishning oddiy usuli: bu nuqtalar orasiga globusdagi ipni tortib olishingiz kerak.


    Aytilganlardan so'ng, nima uchun dengiz xaritasidagi eng qisqa yo'l to'g'ri chiziq sifatida emas, balki egri chiziq sifatida tasvirlanganligi aniq bo'ladi.

    Ularning ta'kidlashicha, Nikolaev (hozirgi Oktyabrskaya) temir yo'li uchun yo'nalishni tanlashda uni qaysi yo'l bilan yotqizish haqida cheksiz bahslar bo'lgan. Munozaralarga Tsar Nikolay I ning aralashuvi bilan chek qo'yildi, u muammoni tom ma'noda "to'g'ridan-to'g'ri" hal qildi: u Sankt-Peterburgni Moskva bilan chiziq bo'ylab bog'ladi. Agar bu Merkator xaritasida amalga oshirilgan bo'lsa, bu sharmandali ajablanib bo'lar edi: to'g'ri chiziq o'rniga yo'l egri chiziqqa aylangan bo'lardi.

    Hisob-kitoblardan qochmaydiganlar oddiy hisob-kitoblar orqali bizga qiyshiq bo'lib ko'rinadigan xaritada biz to'g'ri ko'rib chiqishga tayyor bo'lgan yo'ldan qisqaroq ekanligiga ishonch hosil qilishlari mumkin. Ikki bandargohimiz 60-parallelda yotib, bir-biridan 60° masofada boʻlsin. (Bunday ikkita bandargohning mavjudligi, albatta, hisoblash uchun ahamiyatsiz.)



    Guruch. 4. To‘pning parallel yoyi bo‘ylab va katta aylana yoyi bo‘ylab A va B nuqtalar orasidagi masofalarni hisoblashga.


    Shaklda. 4 ball HAQIDA - yer sharining markazi, AB - bandargohlar yotadigan kenglik doirasining yoyi A va B; ichida uning 60°. Kenglik aylanasining markazi bir nuqtada FROM Buni markazdan tasavvur qiling HAQIDA Yer shari xuddi shu portlar orqali katta doira yoyi chizilgan: uning radiusi OB = OA = R; chizilgan yoyga yaqindan o'tadi AB, lekin mos kelmaydi.

    Keling, har bir yoyning uzunligini hisoblaylik. Ballardan beri LEKIN Va IN 60° kenglikda, keyin radiuslarda yotadi O.A Va O.V bilan tuzing OS(globus o'qi) 30 ° burchak. To'g'ri uchburchakda ASO oyoq AC (=r), 30° burchakka qarama-qarshi yotish gipotenuzaning yarmiga teng OAJ;

    anglatadi, r=R/2 Ark uzunligi AB kenglik aylanasining oltidan bir qismidir va bu doira katta doira uzunligining yarmiga (radiusning yarmiga to'g'ri keladi) ega bo'lganligi sababli, kichik doira yoyi uzunligi



    Xuddi shu nuqtalar orasiga chizilgan katta aylana yoyi uzunligini aniqlash uchun (ya'ni, ular orasidagi eng qisqa yo'l) biz burchakning kattaligini bilishimiz kerak. AOW. Akkord AS, yoyni 60 ° ga ayirish (kichik doira), bir xil kichik doira ichiga yozilgan muntazam olti burchakning tomoni; shunung uchun AB \u003d r \u003d R / 2

    To'g'ri chiziq chizish od, ulanish markazi HAQIDA o'rtasi bilan globus D akkordlar AB, to'g'ri uchburchakni oling ODA, burchak qayerda D- Streyt:

    DA= 1/2 AB va OA=R.

    sinAOD=AD: AO=R/4:R=0,25

    Bu yerdan biz topamiz (jadvallarga ko'ra):

    =14°28",5

    va shuning uchun

    = 28°57".

    Endi eng qisqa yo'lning kerakli uzunligini kilometrlarda topish qiyin emas. Agar biz globusning katta aylanasi daqiqasining uzunligini eslasak, hisobni soddalashtirish mumkin.

    Biz bilamizki, dengiz xaritasida to'g'ri chiziq bilan ko'rsatilgan kenglik doirasi bo'ylab yo'l 3333 km, katta doira bo'ylab - xaritadagi egri chiziq bo'ylab - 3213 km, ya'ni 120 km qisqaroq.

    Qo'lingizda ip va globus bilan qurollangan holda, siz chizmalarimizning to'g'riligini osongina tekshirishingiz va katta doiralarning yoylari chizmalarda ko'rsatilganidek yotishiga ishonch hosil qilishingiz mumkin. Shaklda ko'rsatilgan. 1 go'yo Afrikadan Avstraliyagacha bo'lgan "to'g'ri" dengiz yo'li 6020 milya, "egri" esa 5450 milya, ya'ni 570 milya yoki 1050 km ga qisqaroq. Londondan Shanxaygacha bo'lgan dengiz xaritasidagi "to'g'ridan-to'g'ri" havo yo'li Kaspiy dengizini kesib o'tadi, haqiqatan ham eng qisqa yo'l Sankt-Peterburg shimolida joylashgan. Vaqt va yoqilg‘ini tejashda bu masalalar qanday rol o‘ynashi aniq.

    Agar suzib yurish davrida yuk tashish vaqti har doim ham qadrlanmagan bo'lsa, unda "vaqt" hali "pul" deb hisoblanmagan bo'lsa, bug'li kemalar paydo bo'lishi bilan har bir qo'shimcha iste'mol qilingan ko'mir uchun to'lash kerak bo'ladi. Shuning uchun bizning kunlarda kemalar haqiqatan ham eng qisqa yo'l bo'ylab harakatlanadi, ko'pincha Merkatorda emas, balki "markaziy" proyeksiya deb ataladigan xaritalardan foydalanadi: bu xaritalarda katta doiralar yoylari to'g'ri chiziqlar sifatida tasvirlangan.

    Nima uchun sobiq navigatorlar bunday aldamchi xaritalardan foydalanishdi va noqulay yo'llarni tanlashdi? Qadimgi kunlarda ular dengiz xaritalarining hozir ko'rsatilgan xususiyati haqida bilishmagan deb o'ylash xato. Bu, albatta, bu bilan emas, balki Merkator usuli bo'yicha chizilgan jadvallarning noqulayliklar bilan birga dengizchilar uchun juda qimmatli foydalari borligi bilan izohlanadi. Bunday xarita, birinchi navbatda, kontur burchaklarini saqlab, yer yuzasining alohida kichik qismlarini buzilmasdan tasvirlaydi. Bu ekvatordan uzoqlashganda barcha konturlar sezilarli darajada cho'zilishi bilan zid kelmaydi. Yuqori kengliklarda cho'zilish shunchalik muhimki, dengiz xaritasi uning xususiyatlari bilan tanish bo'lmagan odamni qit'alarning haqiqiy o'lchami haqida mutlaqo noto'g'ri fikr bilan ilhomlantiradi: Grenlandiya Afrika, Alyaska bilan bir xil o'lchamdagiga o'xshaydi. Avstraliyadan kattaroq, ammo Grenlandiya Afrikadan 15 baravar kichik, Alyaska esa Grenlandiya bilan birgalikda Avstraliyaning yarmiga teng. Ammo jadvalning bu xususiyatlari bilan yaxshi tanish bo'lgan dengizchi ular tomonidan aldanib bo'lmaydi. U ularga toqat qiladi, ayniqsa kichik hududlarda dengiz xaritasi tabiatning aniq o'xshashligini beradi (5-rasm).

    Boshqa tomondan, dengiz xaritasi navigatsiya amaliyoti vazifalarini hal qilishni sezilarli darajada osonlashtiradi. Bu doimiy yo'nalishdagi kemaning yo'li to'g'ri chiziq sifatida tasvirlangan yagona diagramma turidir. "Doimiy yo'nalish" bo'yicha harakat qilish har doim bir yo'nalishni, bitta aniq "rumbni" ushlab turishni, boshqacha aytganda, barcha meridianlarni teng burchak ostida kesib o'tadigan tarzda borishni anglatadi. Lekin bu yoʻl (“loksodrom”) faqat xaritada barcha meridianlar bir-biriga parallel toʻgʻri chiziqlar boʻlgan toʻgʻri chiziq sifatida tasvirlanishi mumkin. Va globusda kenglik doiralari meridianlar bilan to'g'ri burchak ostida kesishganligi sababli, bunday xaritada kenglik doiralari meridianlarning chiziqlariga perpendikulyar to'g'ri chiziqlar bo'lishi kerak. Muxtasar qilib aytganda, biz dengiz xaritasining o'ziga xos xususiyatini tashkil etuvchi koordinatali to'rga aniq etib boramiz.




    Guruch. 5. Yer sharining dengiz yoki Merkator xaritasi. Bunday xaritalarda ekvatordan uzoqda joylashgan konturlarning o'lchamlari juda bo'rttirilgan. Masalan, qaysi biri kattaroq: Grenlandiyami yoki Avstraliyami? (javob matnda)


    Dengizchilarning Mercator xaritalariga bo'lgan qiziqishi endi tushunarli. Belgilangan portga borishda borish kerak bo'lgan yo'nalishni aniqlashni istab, navigator yo'lning oxirgi nuqtalariga o'lchagichni qo'llaydi va meridianlar bilan qilgan burchakni o'lchaydi. Ushbu yo'nalishda doimo ochiq dengizda bo'lgan navigator kemani aniq nishonga olib boradi. Ko'ryapsizmi, "loksodrom" garchi eng qisqa va eng tejamkor bo'lmasa-da, lekin ma'lum jihatdan dengizchi uchun juda qulay yo'l. Misol uchun, Yaxshi umid burnidan Avstraliyaning janubiy uchigacha (1-rasmga qarang) erishish uchun har doim bir xil yo'nalishni S 87 °, 50 "tutish kerak. Ayni paytda, kemani bir xil joyga olib kelish uchun Eng qisqa yo'lda (" ” bo'ylab) yakuniy nuqta, rasmdan ko'rinib turganidek, tomirning yo'nalishini doimiy ravishda o'zgartirish kerak: S 42 °.50 "yo'nalishidan boshlang va N kursi bilan yakunlang. 53 °.50" (bu holda, eng qisqa yo'lni ham amalga oshirish mumkin emas - u Antarktidaning muz devoriga tayanadi).

    Ikkala yo'l ham - "loksodrom" bo'ylab va "ortodromiya" bo'ylab - faqat katta doira bo'ylab yo'l dengiz xaritasida to'g'ri chiziq sifatida tasvirlanganida mos keladi: ekvator bo'ylab yoki meridian bo'ylab harakatlanayotganda. Boshqa barcha holatlarda bu yo'llar boshqacha.

    (Tasviriy geometriya)
  • CD (CXDX, C2D2) nuqta sifatida ko'rsatiladi C5 = D5 A5B5 teng...
    (Tasviriy geometriya)
  • Ikki parallel tekislik orasidagi masofani aniqlash
    Umumiy holatda ikkita parallel tekislik orasidagi masofani aniqlash 01| X uni proyeksiyalovchilar holatiga aylantirilgan bir xil ikkita tekislik orasidagi masofani aniqlash masalasiga qisqartirish qulay. Bunday holda, tekisliklar orasidagi masofa chiziqlar orasidagi perpendikulyar sifatida aniqlanadi, ...
    (Tasviriy geometriya)
  • Ikki kesishuvchi chiziq orasidagi masofani aniqlash
    Agar siz ikkita kesishgan chiziq orasidagi eng qisqa masofani aniqlamoqchi bo'lsangiz, proyeksiya tekisliklari tizimini ikki marta o'zgartirishingiz kerak. Ushbu muammoni hal qilishda to'g'ridan-to'g'ri CD (CXDX, C2D2) nuqta sifatida ko'rsatiladi C5 = D5(198-rasm). Bu nuqtadan proyeksiyagacha bo'lgan masofa A5B5 teng...
    (Tasviriy geometriya)
  • Ikki kesishuvchi to'g'ri chiziq orasidagi burchak
    Bu ma'lumotlarga parallel bo'lgan ikkita kesishuvchi chiziq orasidagi burchak. Shunday qilib, bu vazifa avvalgisiga o'xshaydi. Uni yechish uchun ixtiyoriy nuqtani olish va u orqali berilgan qiyshaygan chiziqlarga parallel ikkita chiziq o‘tkazish va kerakli burchakni aniqlash uchun proyeksiya transformatsiyasidan foydalanish kerak....
    (Chizma geometriya asoslari. Qisqa kurs va masalalar to‘plami).
  • Ikki parallel chiziq orasidagi masofani aniqlash
    Muammo proyeksiya tekisliklarini ikki marta almashtirish usuli bilan hal qilinadi. Yakuniy bosqichda proyeksiya tekisliklaridan biri kesishuvchi chiziqlardan biriga perpendikulyar bo'lishi kerak. Keyin ular orasidagi eng qisqa masofa boshqa qiyshaygan chiziqqa perpendikulyar segmentning qiymati bilan aniqlanadi (199-rasm)....
    (Tasviriy geometriya)
  • Rasmdagi nuqta chiziq bo'ylab yo'l qattiq chiziq bo'ylab yo'lga qaraganda qisqaroq. Va endi dengiz yo'llari misolida biroz batafsilroq:

    Agar siz doimiy yo'nalishda suzib ketsangiz, u holda kemaning er yuzidagi traektoriyasi matematikada deyilgan egri chiziq bo'ladi. logarifmikspiral.

    Navigatsiyada bu murakkab ikki tomonlama egri chiziq deyiladi loksodromiya, bu yunoncha "qiyshiq yugurish" degan ma'noni anglatadi.

    Biroq, yer sharidagi ikkita nuqta orasidagi eng qisqa masofa katta aylana yoyi bo'ylab o'lchanadi.

    Katta aylana yoyi er yuzasining er markazidan o'tuvchi tekislik bilan kesishmasidan iz sifatida olinadi, to'p sifatida olinadi.

    Navigatsiyada katta aylana yoyi deyiladi katta doira, bu "to'g'ri yugurish" degan ma'noni anglatadi. Katta doiraning ikkinchi xususiyati shundaki, u meridianlarni turli burchaklarda kesib o'tadi (29-rasm).

    Loxodrom va ortodrom boʻylab yer yuzasidagi ikki nuqta orasidagi masofalar farqi faqat yirik okean kesishuvlari uchun amaliy ahamiyatga ega.

    Oddiy sharoitlarda bu farq e'tiborga olinmaydi va navigatsiya doimiy kursda amalga oshiriladi, ya'ni. loxodrom tomonidan.

    Tenglamani chiqarish uchun loksodromiyalarni olamiz (30-rasm, lekin) ikki nuqta LEKIN Va IN, ular orasidagi masofa shunchaki kichik. Meridianlarni va ular orqali parallel chizib, biz elementar to'g'ri burchakli sferik uchburchakni olamiz ABC. Bu uchburchakda meridian va parallel kesishmasidan hosil bo'lgan burchak to'g'ri, burchak esa PnAB K. Katet kemasining kursiga teng AC meridian yoyi segmentini ifodalaydi va ifodalanishi mumkin

    qayerda R - shar shaklida olingan Yerning radiusi;

    Dph - kenglikning elementar o'sishi (kengliklarning farqi).

    oyoq SW parallel yoy segmentini ifodalaydi

    qayerda r - parallel radiusi;

    Δλ - uzunliklarning elementar farqi.

    OO 1 C uchburchakdan deb topish mumkin

    Keyin oxirgi shaklda oyoq SW quyidagicha ifodalash mumkin:

    Elementar sferik uchburchakni qabul qilish ABC kvartira uchun, yozing

    Qisqartirilgandan keyin R va koordinatalarning elementar kichik o'sishini cheksiz kichiklar bilan almashtiramiz

    Olingan ifodani ph 1, l 1 dan ph 2 gacha bo'lgan oraliqda birlashtiramiz, λ 2 tgK qiymatini doimiy qiymat sifatida hisobga olgan holda:

    O'ng tomonda bizda jadvalli integral mavjud. Uning qiymatini almashtirgandan so'ng, biz to'pdagi loksodrom tenglamasini olamiz

    Ushbu tenglamani tahlil qilish bizga quyidagi xulosalar chiqarish imkonini beradi:

    0 va 180 ° kurslarda loksodrom katta aylana yoyi - meridianga aylanadi;

    90 va 270 ° kurslarda loksodrom parallelga to'g'ri keladi;

    Loxodrom har bir parallelni faqat bir marta, har bir meridianni esa sanoqsiz sonli marta kesib o'tadi. bular. qutbga spiral tarzda yaqinlashib, unga etib bormaydi.

    Doimiy yo'nalishda, ya'ni loksodrom bo'ylab navigatsiya, garchi bu Yerdagi ikki nuqta orasidagi eng qisqa masofa bo'lmasa ham, navigator uchun katta qulaylik yaratadi.

    Dengiz navigatsiya xaritasiga qo'yiladigan talablar loksodrom bo'ylab navigatsiyaning afzalligi va uning tenglamasini tahlil qilish natijalari asosida quyidagicha shakllantirilishi mumkin.

    1. Meridianlarni doimiy burchak ostida kesib o'tuvchi loksodrom to'g'ri chiziq shaklida tasvirlanishi kerak.

    2. Xaritalarni qurishda foydalaniladigan kartografik proyeksiya konformal bo'lishi kerak, shunda undagi kurslar, podshipniklar va burchaklar ularning yerdagi qiymatiga mos keladi.

    3. Meridianlar va parallellar 0, 90, 180 va 270 ° kurs chiziqlari kabi o'zaro perpendikulyar to'g'ri chiziqlar bo'lishi kerak.

    Sfera shaklida olingan Yer yuzasida berilgan ikkita nuqta orasidagi eng qisqa masofa bu nuqtalardan oʻtuvchi katta aylana yoylarining eng kichiki hisoblanadi. Meridian yoki ekvator bo'ylab harakatlanadigan kema bundan mustasno, katta doira meridianlarni turli burchaklarda kesib o'tadi. Shuning uchun, bunday egri chiziq bo'ylab harakatlanadigan kema har doim o'z yo'nalishini o'zgartirishi kerak. Meridianlar bilan doimiy burchak hosil qiladigan va xaritada Merkator proyeksiyasida to'g'ri chiziq - loksodrom bilan tasvirlangan kursni kuzatish amalda qulayroqdir. Biroq, katta masofalarda ortodrom va loksodrom uzunligidagi farq sezilarli qiymatga etadi. Shuning uchun bunday hollarda ortodrom hisoblab chiqiladi va unda oraliq nuqtalar belgilanadi, ular orasida ular loksodrom bo'ylab suzadilar.

    Yuqoridagi talablarga javob beradigan kartografik proyeksiya 1569 yilda gollandiyalik kartograf Jerar Kramer (Mercator) tomonidan taklif qilingan. Uning yaratuvchisi sharafiga proyeksiya nomi berilgan. Merkator.

    Va kim ko'proq qiziqarli ma'lumotlarni o'rganishni xohlasa, ko'proq bilib oling Asl maqola veb-saytda InfoGlaz.rf Ushbu nusxa olingan maqolaga havola -

    DISTANCE, masofalar, qarang. 1. Ikki nuqtani ajratib turuvchi bo‘shliq, biror narsa orasidagi bo‘shliq. To'g'ri chiziqdagi ikkita nuqta orasidagi eng qisqa masofa. Bizdan ikki kilometr uzoqlikda yashaydi. "Komendant ularni eng yaqin masofadan ichkariga kiritdi ... Ushakovning izohli lug'ati

    masofa- ot, s., ishlatish. tez-tez Morfologiya: (yo'q) nima? masofa nima uchun? masofa, (qarang) nima? masofadan? masofa, nima? masofa haqida; pl. nima? masofa, (yo'q) nima? masofalar, nima uchun? masofalar, (qarang) nima? masofadan? masofalar... Dmitriev lug'ati

    masofa- men; qarang. Ikki nuqtani, ikkita ob'ektni va hokazolarni ajratib turadigan bo'shliq, l dan ko'ra kimdir orasidagi bo'shliq. Eng qisqa daryo ikki nuqta o'rtasida. R. uydan maktabgacha. Yaqin atrofdagi daryoga chekining. Bir metr masofada, qo'llar cho'zilgan. Biror narsani biling, nimanidir his qiling. ustida… … ensiklopedik lug'at

    masofa- men; qarang. Shuningdek qarang masofa a) Ikki nuqtani, ikkita jismni va hokazolarni ajratib turadigan bo'shliq, l dan birov orasidagi bo'shliq. Ikki nuqta orasidagi eng qisqa masofa. Uydan maktabgacha bo'lgan masofa. Yaqin masofaga chekinish / nie ... Ko'p iboralar lug'ati

    GEOMETRIYA- matematikaning turli shakllarning xossalarini (nuqtalar, chiziqlar, burchaklar, ikki o'lchovli va uch o'lchovli narsalar), ularning kattaligi va nisbiy holatini o'rganadigan bo'limi. O'qitish qulayligi uchun geometriya planimetriya va qattiq geometriyaga bo'linadi. IN…… Collier entsiklopediyasi

    Navigatsiya*

    Navigatsiya- navigatsiya bo'limi (qarang), kompas va jurnaldan foydalangan holda kemaning dengizdagi joyini aniqlash usullari taqdimotini yakunlash (qarang). Kemaning dengizdagi o'rnini aniqlash xaritaga hozirgi vaqtda kema joylashgan nuqtani qo'yishni anglatadi. ... ... Entsiklopedik lug'at F.A. Brockhaus va I.A. Efron

    COGEN- (Koen) Hermann (1842 1918) nemis faylasufi, neokantizmning Marburg maktabining asoschisi va atoqli vakili. Asosiy asarlari: “Kantning tajriba nazariyasi” (1885), “Kantning axloqni asoslashi” (1877), “Kantning estetikani asoslashi” (1889), “Mantiq... ...

    Kant Immanuel- Kantning hayot yoʻli va ijodi Immanuil Kant 1724-yilda Sharqiy Prussiyaning Konigsberg (hozirgi Kaliningrad) shahrida tugʻilgan. Otasi egarchi, onasi esa uy bekasi boʻlgan, olti farzandi voyaga yetmagan. Kant har doim ota-onasini ...... bilan eslagan. G'arb falsafasi o'zining kelib chiqishidan to hozirgi kungacha

    KANTNING TANIQIY FALSAFASI: QOBILIYATLAR TAQIDA TA'LIMAT.- (La philosophie eleştiri de Kant: Doctrines des facultes, 1963) Deleuz tomonidan. Kirish qismida transsendental usulni tavsiflab, Deleuz qayd etadiki, Kant falsafani barcha bilimlarning muhim maqsadlarga aloqadorligi haqidagi fan sifatida tushunadi... ... Falsafa tarixi: Entsiklopediya

    fermer xo'jaligi printsipi- geometrik optikaning asosiy printsipi (Qarang: Geometrik optika). F. p.ning eng oddiy koʻrinishi yorugʻlik nuri har doim yoʻl boʻylab ikki nuqta orasidagi fazoda uning oʻtish vaqti ... dan kam boʻlgan fazoda tarqaladi, degan taʼkiddir. Buyuk Sovet Entsiklopediyasi

    Deykstra algoritmi 1959 yilda golland olimi Edsger Deykstra tomonidan ixtiro qilingan grafik algoritmdir. Grafikning bir cho'qqisidan qolgan barcha nuqtalarga eng qisqa yo'llarni topadi. Algoritm ishlaydi faqat manfiy og'irlikdagi qirralari bo'lmagan grafiklar uchun.

    Rasmda ko'rsatilgan grafik misolida algoritmning bajarilishini ko'rib chiqing.

    1-cho'qqidan qolgan barcha nuqtalargacha bo'lgan eng qisqa masofalarni topish talab qilinsin.

    Doiralar cho'qqilarni, chiziqlar ular orasidagi yo'llarni (grafikning qirralarini) ko'rsatadi. Cho'qqilarning raqamlari doiralarda ko'rsatilgan, ularning "narxi" - yo'lning uzunligi - qirralarning tepasida ko'rsatilgan. Har bir cho'qqi yonida qizil yorliq belgilanadi - bu cho'qqiga 1-cho'qqigacha bo'lgan eng qisqa yo'lning uzunligi.

    Birinchi qadam. Bizning misolimiz uchun Dijkstra algoritmidagi qadamni ko'rib chiqing. 1-vertex minimal yorlig'iga ega.2, 3 va 6 cho'qqilar uning qo'shnilaridir.

    1-cho'qqining birinchi qo'shnisi o'z navbatida 2-cho'qqidir, chunki unga boradigan yo'lning uzunligi minimaldir. 1-cho'qqi orqali unga boradigan yo'lning uzunligi 1-cho'qqi yorlig'i qiymati va 1-dan 2-gacha bo'lgan chekka uzunligi yig'indisiga teng, ya'ni 0 + 7 = 7. 2-cho'qqining joriy yorlig'i, cheksizlik, shuning uchun 2-cho'qqining yangi yorlig'i 7 ga teng.

    Biz shunga o'xshash operatsiyani 1-vertexning boshqa ikkita qo'shnisi - 3 va 6-chi bilan bajaramiz.

    1-tugunning barcha qo'shnilari tekshiriladi. 1-cho'qqigacha bo'lgan joriy minimal masofa yakuniy hisoblanadi va qayta ko'rib chiqilmaydi (bu haqiqatdan ham shunday ekanligini birinchi marta E. Dijkstra isbotlagan). Ushbu tepaga tashrif buyurilganligini belgilash uchun uni grafikdan kesib o'ting.

    Ikkinchi qadam. Algoritm bosqichi takrorlanadi. Yana biz ko'rilmagan cho'qqilarning "eng yaqinini" topamiz. Bu 7 deb belgilangan 2-cho'qqi.

    Yana biz tanlangan cho'qqining qo'shnilarining teglarini kamaytirishga harakat qilamiz, ular orqali 2-cho'qqi orqali o'tishga harakat qilamiz. Vertex 2 ning qo'shnilari 1, 3 va 4 uchlaridir.

    2 cho'qqisining birinchi (tartibda) qo'shnisi 1 cho'qqidir. Lekin u allaqachon tashrif buyurilgan, shuning uchun biz 1-cho'qqi bilan hech narsa qilmaymiz.

    2-cho'qqining keyingi qo'shnisi 3-cho'qqidir, chunki u kirmagan deb belgilangan cho'qqilarning minimal yorlig'iga ega. Agar siz unga 2 orqali o'tsangiz, unda bunday yo'lning uzunligi 17 ga teng bo'ladi (7 + 10 = 17). Ammo uchinchi cho'qqining joriy yorlig'i 9 ga teng, bu 17 dan kam, shuning uchun yorliq o'zgarmaydi.

    2-cho'qqining yana bir qo'shnisi - 4-cho'qqi. Agar siz unga 2-chi orqali o'tsangiz, unda bunday yo'lning uzunligi 2-cho'qqigacha bo'lgan eng qisqa masofa va 2 va 4 cho'qqilar orasidagi masofa yig'indisiga teng bo'ladi, ya'ni , 22 (7 + 15 = 22) . 22 dan beri<, устанавливаем метку вершины 4 равной 22.

    2-vertexning barcha qo'shnilari ko'rib chiqildi, biz unga masofani muzlatib qo'yamiz va tashrif buyurilgan deb belgilaymiz.

    Uchinchi qadam. Algoritmning qadamini 3-cho‘qqini tanlab takrorlaymiz. Uni “qayta ishlash”dan so‘ng biz quyidagi natijalarni olamiz:

    Keyingi qadamlar. Qolgan cho'qqilar uchun algoritmning qadamini takrorlaymiz. Bular mos ravishda 6, 4 va 5 uchlari bo'ladi.

    Algoritmning bajarilishini yakunlash. Algoritm boshqa cho'qqilarni qayta ishlash mumkin bo'lmaganda tugaydi. Bu misolda barcha cho'qqilar chizilgan, lekin har qanday misolda shunday bo'ladi deb o'ylash xatodir - agar ularga etib bo'lmasa, ya'ni grafik uzilgan bo'lsa, ba'zi cho'qqilar chizilmagan holda qolishi mumkin. Algoritmning natijasi oxirgi rasmda ko'rinadi: 1 cho'qqidan 2 gacha bo'lgan eng qisqa yo'l - 7, 3 - 9, 4 - 20, 5 - 20, 6 - 11.

    Algoritmni turli dasturlash tillarida amalga oshirish:

    C++

    #include "stdafx.h" #include std nom maydonidan foydalanish; const int V=6; // Dijkstra algoritmi void 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("pauza>>void"); )

    Paskal

    DijkstraAlgoritm dasturi; usescrt; constV=6; inf=100000; turi vektor=butun sonlar massivi; var start: integer; const GR: butun sonlar massivi=((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 algoritmi) protsedurasi Dijkstra(GR: array of integer; st: integer); var count, index, i, u, m, min: integer; masofa: vektor; tashrif buyurdi: boolean massivi; startm:=st; i:=1 dan V gacha boshlash masofasi uchun[i]:=inf; tashrif buyurdi[i]:=false; oxiri; masofa:=0; count:=1 to V-1 uchun min:=inf; uchun i:=1 dan V gacha, agar (ziyorat qilinmagan[i]) va (masofa[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) va (masofa[u]<>inf) va (masofa[u]+GR inf keyin writeln(m," > ", i," = ", masofa[i]) else writeln(m," > ", i," = ", "marshrut mavjud emas"); oxiri; (asosiy dastur bloki) start clrscr; write("Boshlash tugun >> "); o'qish (boshlash); Dijkstra (GR, start); oxiri.

    Java

    import java.io.BufferedReader; import java.io.IOException; java.io.InputStreamReaderni import qilish; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; umumiy sinf Yechim ( private static int INF = Integer.MAX_VALUE / 2; private int n; //digraphdagi cho'qqilar soni private int m; //digraph shaxsiy ArrayListdagi yoylar soni adj; //qo'shnilar ro'yxati xususiy ArrayList vazn; //digraphdagi chekka og'irligi xususiy mantiqiy ishlatiladi; //o'tgan va o'tmagan cho'qqilar haqidagi ma'lumotlarni saqlash uchun massiv private int dist; //boshlang'ich cho'qqigacha bo'lgan masofani saqlash uchun massiv //boshlang'ich cho'qqidan eng qisqa yo'lni tiklash uchun zarur bo'lgan ajdodlar massivi private int pred; int start; //boshlang'ich cho'qqi, undan qolgan barcha masofalar shaxsiy BufferedReader cin qidiriladi; xususiy PrintWriter cout; xususiy StringTokenizer tokenizer; //Dijkstra algoritmini boshlang'ich cho'qqidan boshlash tartibi private void dejkstra(int s) ( dist[s] = 0; //boshlang'ich cho'qqigacha bo'lgan eng qisqa masofa 0 uchun (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(); ) //qirralarning og'irligini saqlaydigan ro'yxatni ishga tushirish = yangi ArrayList[n]; uchun (int i = 0; i< n; ++i) { weight[i] = new ArrayList(); ) //(int i = 0; i) uchun qirralarning roʻyxatida berilgan grafikni oʻqing< 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(); } }

    Boshqa variant:

    java.io.* importi; import java.util.*; umumiy sinf Dijkstra ( xususiy statik yakuniy Graph.Edge GRAPH = ( yangi Graph.Edge("a", "b", 7), yangi Graph.Edge("a", "c", 9), yangi Graph.Edge( "a", "f", 14), yangi Graph.Edge("b", "c", 10), yangi Graph.Edge("b", "d", 15), yangi Graph.Edge("c ", "d", 11), yangi Graph.Edge("c", "f", 2), yangi Graph.Edge("d", "e", 6), yangi Graph.Edge("e", "f", 9), ); shaxsiy statik yakuniy String START = "a"; xususiy statik yakuniy String END = "e"; umumiy statik bekor asosiy(String args) ( Grafik g = yangi Grafik(GRAPH); g.dijkstra (START); g.printPath(END); //g.printAllPaths(); ) ) sinf Grafik (maxfiy yakuniy xarita) grafik; // Edges toʻplamidan qurilgan Vertex obʼyektlariga choʻqqi nomlarini xaritalash /** Grafikning bir cheti (faqat Graph konstruktori tomonidan qoʻllaniladi) */ umumiy statik sinf 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; ) ) /** Grafikning bir cho‘qqisi, qo‘shni cho‘qqilarga solishtirish bilan to‘liq */ umumiy statik sinf Vertex ilovalari Comparable ( umumiy yakuniy String nomi; public int dist = Integer.MAX_VALUE; // MAX_VALUE cheksiz umumiy Vertex oldingi = null; ochiq yakuniy xarita qo'shnilar = yangi HashMap<>(); public Vertex(String name) ( this.name = name; ) private void printPath() ( if (his (this == this.previous)) ( System.out.printf("%s", this.name); ) other if ( this.previous == null) ( System.out.printf("%s(etishmagan)", 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); ) ) /** Qirralar to‘plamidan grafik tuzadi * / umumiy Grafik(Chet qirralari) (grafik = yangi HashMap<>(qirralari.uzunligi); //(Edge e: qirralar) ( 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)) uchun qo‘shni cho‘qqilarni o‘rnatish uchun yana bir o‘tish. neighbours.put(graph.get(e.v2), e.dist); //graph.get(e.v2).neighbours.put(graph.get(e.v1), e.dist); // shuningdek yo'naltirilmagan grafik uchun buni bajaring ) ) /** dijkstra-ni ko'rsatilgan manba cho'qqisidan foydalanib ishga tushiradi */ public void dijkstra(String startName) ( if (!graph.containsKey(startName)) ( System.err.printf("Grafik ishlamaydi" boshlang'ich cho'qqisini o'z ichiga oladi \"%s\"\n", startName); return; ) yakuniy Vertex manbai = graph.get(startName); NavigableSet q = yangi TreeSet<>(); // (Vertex v: graph.values()) uchun oʻrnatish choʻqqilari ( v.previous = v == manba ? manba: null; v.dist = v == manba ? 0: Integer.MAX_VALUE; q.add( v); ) dijkstra(q); ) /** Dijkstra algoritmini ikkilik toʻplam yordamida amalga oshirish. */ private void dijkstra(final NavigableSet) q) ( Vertex u, v; while (!q.isEmpty()) ( u = q.pollFirst(); // eng qisqa masofaga ega cho‘qqi (birinchi iteratsiya manbani qaytaradi) agar (u.dist == Integer.MAX_VALUE) break; // biz u (va boshqa har qanday boshqa cho'qqilarni) e'tiborsiz qoldira olamiz, chunki ularga erishib bo'lmaydi // (Map.Entry) uchun har bir qo'shni masofaga qarang. a: u.neighbours.entrySet()) ( v = a.getKey(); //bu iteratsiyadagi qo'shni final int alternateDist = u.dist + a.getValue(); agar (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

    #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi //#BIG_EXAMPLE belgilang typedef struct node_t node_t, *heap_t; typedef struct edge_t edge_t; struct edge_t ( node_t *nd; /* bu chekkaning maqsadi */ edge_t *qardosh;/* yakka bog‘langan ro‘yxat uchun */ int len; /* chekka narxi */ ); struct node_t ( edge_t *chekka; /* chekkalarning bir-biriga bog‘langan ro‘yxati */ node_t *via; /* bu erda oldingi tugun eng qisqa yo‘lda joylashgan */ double dist; /* boshlang‘ich tugundan masofa */ char nomi; /* the, er , nomi */ int heap_idx; /* masofani yangilash uchun to'p pozitsiyasiga havola */ ); /* --- chekka boshqaruvi --- */ #ifdef BIG_EXAMPLE # BLOCK_SIZE ni aniqlash (1024 * 32 - 1) #else # BLOCK_SIZE ni aniqlash 15 #endif edge_t *edge_root = 0, *e_next = 0; /* Xotirani boshqarish bilan bog'liq narsalarga e'tibor bermang, ular muhim emas. Pretend 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->lenext = d; e_ ->singling = a->edge; a->edge = e_next; ) void free_edges() ( uchun (; edge_root; edge_root = e_next) ( e_next = edge_root.sibling; free(edge_root); ) ) /* --- ustuvor navbatdagi narsalar --- */ heap_t *heap; int heap_len; void set_dist(tugun_t *nd, node_t *orqali, double d) ( int i, j; /* allaqachon yaxshiroq yo'lni bilar edi */ if (nd->via &&) d >= nd->dist) qaytish; /* mavjud yig'ma yozuvni toping yoki yangisini yarating */ nd->dist = d; nd->via = via; i = nd->heap_idx; agar (!i) i = ++heap_len; /* upheap */ (; i > 1 && nd->dist uchun)< heap->dist; i = j) (uyma[i] = uyum[j])->heap_idx = i; to'p [i] = nd; nd->heap_idx = i; ) node_t * pop_queue() ( node_t *nd, *tmp; int i, j; agar (!heap_len) 0 qaytarilsa; /* yetakchi elementni olib tashlang, quyruq elementni u erga torting va pastga tushiring */ nd = heap; tmp = heap; uchun (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) sindirish; (heap[i] = heap[j])->heap_idx = i; ) uyum[i] = tmp; tmp->heap_idx = i; qaytish nd; ) /* --- Dijkstra materiallari; erishib bo'lmaydigan tugunlar hech qachon navbatga tushmaydi --- */ void calc_all(node_t *start) ( node_t *lead; edge_t *e; set_dist(start, start, 0); while ((ead = pop_queue())) for ( e = qo'rg'oshin->chet; e; e = e-> birodar) set_dist(e->nd, etakchi, etakchi->dist + e->len); ) bo'sh ko'rsatish_yo'li (tugun_t *nd) ( agar (nd->) orqali == nd) printf("%s", nd->name); else if (!nd->via) printf("%s(urishilmagan)", nd->name); else ( show_path(nd->) orqali via); printf("-> %s(%g) ", nd->name, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # N_NODESni aniqlang ("f" - " a" + 1) node_t *tugunlari = calloc(sizeof(tugun_t), N_NODES); uchun (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, "xarajat" => $edge); $neighbours[$edge] = massiv("end" => $edge, "xarajat" => $edge); ) $vertices = array_unique($vertices); foreach ($vertex sifatida $vertex) ( $dist[$vertex] = INF; $oldingi[$vertex] = NULL; ) $dist[$source] = 0; $Q = $cho'qqilar; while (count($Q) > 0) ( // TODO - minimal $min = INF olishning tezroq yoʻlini toping; foreach ($Q sifatida $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

    kollektsiyalardan import nametuple, pprintdan navbat import pprint sifatida pp inf = float("inf") Edge = namedtuple("Edge", "start, end, cost") class Graph(): def __init__(self, edges): self .edges = edges2 = self.vertices = set(sum((e in edges2), )) def dijkstra(self, source, dest): assert source in self.vertices dist = (vertex: self.vertices ichida vertex uchun inf ) oldingi = (cho'qqi: self.verticesdagi cho'qqi uchun None) dist = 0 q = self.vertices.copy() qo'shnilar = (vertex: set() self.verticesdagi vertex) boshlanish, tugatish, o'z-o'zidan xarajat. qirralar: qo‘shnilar.add((oxiri, narxi)) #pp(qo‘shnilar) esa q: u = min(q, kalit=lambda cho‘qqisi: dist) q.remove(u) agar dist[u] == inf yoki u = = dest: v uchun tanaffus, qo'shnilardagi xarajat[u]: alt = dist[u] + agar 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"]

    Shunga o'xshash maqolalar