Ali veste, zakaj je bolj v ravni črti kot v loku? Določanje razdalje med dvema vzporednima premicama Kolikšna je najkrajša razdalja med dvema točkama

Pot po črtkani črti na sliki je krajša od poti po polni črti. In zdaj malo bolj podrobno na primeru morskih poti:

Če plujete po stalnem tečaju, potem je pot gibanja ladje vzdolž zemeljsko površje bo krivulja, ki se v matematiki imenuje logaritemskispirala.

V navigaciji se ta kompleksna črta dvojne ukrivljenosti imenuje loksodromija, kar v grščini pomeni "poševni tek".

Vendar pa je najkrajša razdalja med dvema točkama na globusu merjena vzdolž loka velikega kroga.

Lok velikega kroga dobimo kot sled iz presečišča zemeljske površine z ravnino, ki poteka skozi središče zemlje, vzeto kot krogla.

V navigaciji se veliki krožni lok imenuje velik krog, kar pomeni "naravnost". Druga značilnost velikega kroga je, da prečka meridiane pod različnimi koti (slika 29).

Razlika v razdaljah med dvema točkama na zemeljskem površju vzdolž loksodroma in ortodrome je praktičnega pomena le za velika prečkanja oceanov.

V normalnih razmerah je ta razlika zanemarjena in plovba poteka po stalnem tečaju, tj. po loksodromu.

Za izpeljavo enačbe vzamemo loksodromije (sl. 30, a) dve piki AMPAK in AT, razdalja med njima je preprosto majhna. Če narišemo meridiane in vzporednik skozi njih, dobimo elementarni pravokotni sferični trikotnik ABC. V tem trikotniku je kot, ki ga tvorita presečišče poldnevnika in vzporednika, pravi, kot pa pnAB enak smeri ladje K. Katet AC predstavlja segment meridianskega loka in se lahko izrazi

kje R - polmer Zemlje kot krogle;

Δφ - osnovni prirastek zemljepisne širine (razlika zemljepisnih širin).

noga JZ predstavlja vzporedni segment loka

kjer je r - polmer vzporednice;

Δλ - elementarna razlika dolžin.

Iz trikotnika OO 1 C mogoče ugotoviti, da

Nato v končni obliki noga JZ se lahko izrazi takole:

Ob predpostavki elementarnega sferičnega trikotnika ABC za stanovanje, napišite

Po zmanjšanju R in zamenjava elementarnih majhnih prirastkov koordinat z infinitezimalnimi, imamo

Nastali izraz integriramo v območju od φ 1, λ 1 do φ 2, λ 2 ob upoštevanju vrednosti tgK kot konstantne vrednosti:

Na desni strani imamo tabelarični integral. Po zamenjavi njegove vrednosti dobimo enačbo loksodroma na krogli

Analiza te enačbe nam omogoča naslednje zaključke:

Pri tečajih 0 in 180 ° se loksodrom spremeni v lok velikega kroga - poldnevnik;

Pri tečajih 90 in 270 ° loksodrom sovpada z vzporednikom;

Loksodrom prečka vsak vzporednik le enkrat, vsak poldnevnik pa neštetokrat. tiste. spiralno približuje polu, ga ne doseže.

Plovba po stalnem tečaju, torej po loksodromu, čeprav ni najkrajša razdalja med dvema točkama na Zemlji, predstavlja za navigatorja precejšnje udobje.

Zahteve za pomorsko navigacijsko karto je mogoče oblikovati na podlagi prednosti plovbe vzdolž loksodroma in rezultatov analize njegove enačbe, kot sledi.

1. Loksodrom, ki prečka meridiane pod stalnim kotom, je treba prikazati kot ravno črto.

2. projekcija zemljevida, ki se uporablja za izdelavo zemljevidov, mora biti enakokoten, tako da smeri, smeri in koti na njem ustrezajo njihovi vrednosti na terenu.

3. Poldnevniki in vzporedniki, tako kot smerne črte 0, 90, 180° in 270°, morajo biti med seboj pravokotni ravni črti.

Najkrajša razdalja med dvema danima točkama na površju Zemlje, vzeta kot krogla, je manjši od lokov velikega kroga, ki poteka skozi ti točki. Razen v primeru ladje, ki sledi poldnevniku ali ekvatorju, veliki krog prečka meridiane pod različnimi koti. Zato mora ladja, ki sledi takšni krivulji, ves čas spreminjati svojo smer. Praktično bolj priročno je slediti poti, ki tvori stalni kot z meridiani in je na zemljevidu v Mercatorjevi projekciji prikazana z ravno črto - loksodrom. Vendar pa na velikih razdaljah razlika v dolžini ortodrome in loksodrome doseže pomembno vrednost. Zato se v takih primerih izračuna ortodroma in na njej označijo vmesne točke, med katerimi plavajo po loksodromi.

Kartografsko projekcijo, ki ustreza zgornjim zahtevam, je predlagal nizozemski kartograf Gerard Cramer (Mercator) leta 1569. V čast njenega ustvarjalca so projekcijo poimenovali Mercator.

In kdo hoče dobiti še več zanimiv podatek nauči se več Izvirni članek je na spletni strani InfoGlaz.rf Povezava do članka, iz katerega je narejena ta kopija -

DALJAVA, razdalje, prim. 1. Prostor, ki ločuje dve točki, vrzel med nečim. Najkrajša razdalja med dvema točkama v ravni črti. Živi od nas na razdalji dveh kilometrov. "Komandant jih je spustil noter na najbližjo razdaljo ... Slovar Ushakov

razdalja- samostalnik, s., uporaba. pogosto Morfologija: (ne) kaj? razdalja za kaj? razdalja, (videti) kaj? oddaljenost od? razdalja, kaj? o razdalji; pl. kaj? razdalja, (ne) kaj? razdalje, zakaj? razdalje, (videti) kaj? oddaljenost od? razdalje... Dmitrijev slovar

razdalja- JAZ; prim. Prostor, ki ločuje dve točki, dva predmeta itd., vrzel med kom, kot l. Najkrajša reka med dvema točkama. R. od doma do šole. Umik k bližnji reki. Na meter razdalje, iztegnjene roke. Nekaj ​​vedeti, nekaj čutiti. na…… enciklopedični slovar

razdalja- JAZ; prim. Poglej tudi razdalja a) Prostor, ki ločuje dve točki, dva predmeta itd., vrzel med kom, kot l. Najkrajša razdalja med dvema točkama. Razdalja od doma do šole. Umik na bližnjo razdaljo / ni ... Slovar številnih izrazov

GEOMETRIJA- veja matematike, ki proučuje lastnosti različnih oblik (točke, črte, koti, dvodimenzionalni in tridimenzionalni predmeti), njihovo velikost in relativni položaj. Zaradi lažjega poučevanja je geometrija razdeljena na planimetrijo in trdno geometrijo. PRI…… Enciklopedija Collier

Navigacija*

Navigacija- oddelek za navigacijo (glej), zaključek predstavitve načinov določanja mesta ladje na morju s pomočjo kompasa in dnevnika (glej). Določiti mesto ladje na morju pomeni na zemljevid postaviti točko, v kateri je ladja ta trenutek nahaja.…… Enciklopedični slovar F.A. Brockhaus in I.A. Efron

COGEN- (Cohen) Hermann (1842 1918) nemški filozof, ustanovitelj in najvidnejši predstavnik marburške šole neokantovstva. Pomembnejša dela: 'Kantova teorija izkustva' (1885), 'Kantova utemeljitev etike' (1877), 'Kantova utemeljitev estetike' (1889), 'Logika… ...

Kant Imanuel- Življenjska pot in pisanje Kanta Immanuel Kant se je rodil v Konigsbergu (danes Kaliningrad) v Vzhodni Prusiji leta 1724. Njegov oče je bil sedlar, mati pa gospodinja, šest njunih otrok ni dočakalo polnoletnosti. Kant se je svojih staršev vedno spominjal z ... ... Zahodna filozofija od njenih začetkov do danes

KANTOVA KRITIČNA FILOZOFIJA: NAUK O SPOSOBNOSTIH- (La philosophie critique de Kant: Doctrines des facultes, 1963) Deleuza. Ko v uvodu opisuje transcendentalno metodo, Deleuze ugotavlja, da Kant razume filozofijo kot znanost o razmerju vsega znanja do bistvenih ciljev... ... Zgodovina filozofije: Enciklopedija

kmečki princip- osnovni princip geometrijske optike (glej Geometrijska optika). Najenostavnejša oblika F. p. je izjava, da se svetlobni žarek vedno širi v prostoru med dvema točkama na poti, po kateri je čas njegovega prehoda krajši od ... Velik sovjetska enciklopedija

(Opisna geometrija)
  • CD (CXDX, C2D2) prikazano kot pika C5 = D5 A5B5 enako ...
    (Opisna geometrija)
  • Določanje razdalje med dvema vzporednima ravninama
    Določanje razdalje med dvema vzporednima ravninama v splošnem položaju 01| X priročno ga je zmanjšati na problem določanja razdalje med istima ravninama, preoblikovan v položaj štrlečih. V tem primeru je razdalja med ravninama definirana kot pravokotnica med črtami, ...
    (Opisna geometrija)
  • Določanje razdalje med dvema sekajočima se črtama
    Če želimo določiti najkrajšo razdaljo med dvema sekajočima se premicama, moramo dvakrat spremeniti sistem projekcijskih ravnin. Pri reševanju tega problema se neposredno CD (CXDX, C2D2) prikazano kot pika C5 = D5(Slika 198). Razdalja od te točke do projekcije A5B5 enako ...
    (Opisna geometrija)
  • Kot med dvema sekajočima se ravnimama
    To je kot med dvema sekajočima se črtama, ki sta vzporedni s podatki. Tako je ta naloga podobna prejšnji. Če ga želite rešiti, morate vzeti poljubno točko in skozi njo narisati dve premici, vzporedni z danimi poševnicami, in s pomočjo transformacije projekcije določiti zahtevani kot....
    (Osnove opisne geometrije. Kratek tečaj in zbirka nalog.)
  • Določanje razdalje med dvema vzporednima premicama
    Problem je rešen z metodo dvojne zamenjave projekcijskih ravnin. Na zadnji stopnji mora biti ena od projekcijskih ravnin pravokotna na eno od sečišč. Potem je najkrajša razdalja med njima določena z vrednostjo segmenta pravokotnice na drugo poševno črto (slika 199)....
    (Opisna geometrija)
  • Ko učitelj na tabli s kredo začrta dve točki, ponudi mlademu učencu nalogo: narisati najkrajšo pot med obema točkama.

    Učenec po premisleku med njima pridno potegne vijugasto črto.

    - To je najkrajša pot! učiteljica je presenečena. - Kdo te je tega naučil?

    - Moj oče. Je taksist.

    Risba naivnega šolarja je seveda anekdota, a ne bi se nasmehnili, če bi vam povedali, da pikčasti lok na sl. 1 je najkrajša pot od Rta dobrega upanja do južne konice Avstralije!

    Še bolj osupljiva je naslednja izjava: prikazana na sl. 2 povratna pot od Japonske do Panamskega prekopa je krajša od ravne črte, ki je med njima narisana na istem zemljevidu!

    riž. 1. Vklopljeno morski zemljevid najkrajša pot od Rta dobrega upanja do južnega konca Avstralije ni označena z ravno črto ("loksodrom"), temveč s krivuljo ("ortodromija")


    Vse to izgleda kot šala, medtem pa so pred vami neizpodbitne resnice, ki jih kartografi dobro poznajo.




    riž. 2. Zdi se neverjetno, da je ukrivljena pot, ki povezuje Jokohamo na pomorski karti s Panamskim prekopom, krajša od ravne črte, narisane med istima točkama


    Da bi razjasnili zadevo, bo treba povedati nekaj besed o kartah na splošno in še posebej o pomorskih kartah. Risanje delov zemeljske površine na papir tudi načeloma ni lahka naloga, saj je Zemlja krogla in vemo, da nobenega dela sferične površine ni mogoče razporediti na ravnino brez gub in prelomov. Nehote se je treba sprijazniti z neizogibnimi izkrivljanji na zemljevidih. Izumili so številne načine risanja zemljevidov, vendar vsi zemljevidi niso brez pomanjkljivosti: nekateri imajo enovrstne popačenja, drugi drugačne, vendar brez popačenj sploh ni zemljevidov.

    Pomorščaki uporabljajo zemljevide, narisane po metodi starega nizozemskega kartografa in matematika iz 16. stoletja. Mercator. Ta metoda se imenuje Mercatorjeva projekcija. Pomorsko karto zlahka prepoznamo po njeni pravokotni mreži: meridiani so na njej prikazani kot niz vzporednih ravnih črt; krogi zemljepisne širine - tudi v ravnih črtah, pravokotnih na prvega (glej sliko 5).

    Zdaj si predstavljajte, da želite najti najkrajšo pot od enega oceanskega pristanišča do drugega na istem vzporedniku. Na oceanu so na voljo vse poti in tja se vedno da potovati po najkrajši poti, če veš, kako leži. V našem primeru je naravno misliti, da gre najkrajša pot po vzporedniku, na katerem ležita obe pristanišči: navsezadnje je na zemljevidu ravna črta in kaj je krajše od ravne poti! Vendar se motimo: pot po vzporednici sploh ni najkrajša.

    Res: na površini krogle je najkrajša razdalja med dvema točkama lok velikega kroga, ki ju povezuje. Toda vzporedni krog majhna krog. Lok velikega kroga je manj ukrivljen kot lok katerega koli majhnega kroga, narisanega skozi isti dve točki: večji polmer ustreza manjši ukrivljenosti. Potegnite nit na globusu med našima dvema točkama (glej sliko 3); se boste prepričali, da sploh ne leži ob vzporednici. Tesna nit - nesporen kazalec najkrajša pot, in če ne sovpada z vzporednikom na globusu, potem na pomorski karti najkrajša pot ni označena z ravno črto: spomnimo se, da so krogi vzporednikov na takem zemljevidu prikazani z ravnimi črtami, vsako črto, ki ne sovpada z ravno črto krivulja .



    riž. 3. Preprost način za iskanje res najkrajše poti med dvema točkama: med tema točkama morate potegniti nit na globusu


    Po povedanem postane jasno, zakaj najkrajša pot na morski karti ni prikazana kot ravna črta, ampak kot ukrivljena črta.

    Pravijo, da pri izbiri smeri za Nikolaevskaya (zdaj Oktyabrskaya) železnica bili so neskončni spori o tem, kako ga položiti. Spore je končalo posredovanje carja Nikolaja I., ki je problem rešil dobesedno »preprosto«: po progi je povezal Sankt Peterburg z Moskvo. Če bi to naredili na Mercatorjevem zemljevidu, bi bilo neprijetno presenečenje: namesto ravne črte bi bila cesta krivina.

    Kdor se ne izogiba izračunom, se lahko s preprostim izračunom prepriča, da je pot, ki se nam na zemljevidu zdi ukrivljena, v resnici krajša od tiste, ki smo jo pripravljeni imeti za ravno. Najini dve pristanišči ležita na 60. vzporedniku in ju loči 60°. (Ali ti dve pristanišči dejansko obstajata, je za izračun seveda nepomembno.)



    riž. 4. K izračunu razdalj med točkama A in B na krogli vzdolž loka vzporednice in vzdolž loka velikega kroga


    Na sl. 4 točka O - center globus, AB - lok zemljepisnega kroga, na katerem ležijo pristanišča A in B; v njenih 60°. Središče kroga zemljepisne širine je v točki OD Predstavljajte si to iz središča O zemeljske oble je skozi ista pristanišča narisan velik krožni lok: njegov polmer OB = OA = R; prešla bo blizu narisanega loka AB, vendar se ne ujema.

    Izračunajmo dolžino vsakega loka. Od točk AMPAK in AT ležijo na zemljepisni širini 60°, nato polmerov OA in OV Pobotati se OS(osi globusa) kot 30°. V pravokotnem trikotniku ASO noga AC (=r), ki leži nasproti kota 30°, je enaka polovici hipotenuze JSC;

    pomeni, r=R/2 Dolžina loka AB je ena šestina dolžine kroga zemljepisne širine in ker ima ta krog polovico dolžine velikega kroga (kar ustreza polovici polmera), potem je dolžina loka majhnega kroga



    Da zdaj določimo dolžino loka velikega kroga, narisanega med istima točkama (tj. najkrajšo pot med njima), moramo poznati velikost kota AOW. Akord AS, odštevanje loka na 60 ° (majhen krog), je stran pravilnega šesterokotnika, vpisanega v isti majhen krog; zato AB \u003d r \u003d R / 2

    Risanje ravne črte od, povezovalni center O globus s sredino D akordi AB, dobite pravokotni trikotnik uradna razvojna pomoč, kje je kot D- naravnost:

    DA= 1/2 AB in OA=R.

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

    Od tu najdemo (glede na tabele):

    =14°28",5

    in zato

    = 28°57".

    Zdaj ni težko najti želene dolžine najkrajše poti v kilometrih. Izračun lahko poenostavimo, če se spomnimo, da je dolžina minute velikega kroga na zemeljski obli

    Izvemo, da je pot po širinskem krogu, ki je na morski karti prikazan z ravno črto, dolga 3333 km, pot po velikem krogu - po krivulji na zemljevidu pa 3213 km, torej 120 km krajša.

    Oboroženi z nitjo in globusom pri roki lahko enostavno preverite pravilnost naših risb in se prepričate, da loki velikih krogov res ležijo tako, kot je prikazano na risbah. Prikazano na sl. 1, kot da je "ravna" morska pot od Afrike do Avstralije 6020 milj, "krivulja" pa 5450 milj, tj. krajša za 570 milj ali 1050 km. "Neposredna" letalska pot na pomorski karti od Londona do Šanghaja seka skozi Kaspijsko jezero, res najkrajša pot pa je severno od St. Jasno je, kakšno vlogo imajo ta vprašanja pri prihranku časa in goriva.

    Če v dobi jadralnega ladijskega prometa čas ni bil vedno cenjen - takrat "čas" še ni veljal za "denar", potem je treba s prihodom parnih ladij plačati za vsako dodatno tono porabljenega premoga. Zato danes ladje plujejo po res najkrajši poti, pri čemer pogosto uporabljajo zemljevide, narejene ne v Mercatorju, ampak v tako imenovani "centralni" projekciji: na teh zemljevidih ​​so loki velikih krogov upodobljeni kot ravne črte.

    Zakaj so potem nekdanji navigatorji uporabljali tako varljive zemljevide in izbirali neugodne poti? Zmotno je misliti, da v starih časih niso poznali danes označene lastnosti pomorskih kart. Zadeve seveda ne pojasnjuje to, ampak dejstvo, da imajo karte, sestavljene po Mercatorjevi metodi, poleg nevšečnosti za jadralce zelo dragocene koristi. Takšen zemljevid, prvič, prikazuje ločene majhne dele zemeljske površine brez popačenj, pri čemer ohranja vogale konture. Temu ne nasprotuje dejstvo, da so z oddaljenostjo od ekvatorja vse konture opazno raztegnjene. Na visokih zemljepisnih širinah je razteznost tako pomembna, da pomorska karta človeka, ki ne pozna njegovih značilnosti, navdihne s popolnoma napačno predstavo o resnični velikosti celin: zdi se, da je Grenlandija enake velikosti kot Afrika, Aljaska je večja od Avstralije, čeprav je Grenlandija 15-krat manjša od Afrike, Aljaska skupaj z Grenlandijo pa za polovico manjša od Avstralije. Toda mornarja, ki je dobro seznanjen s temi značilnostmi karte, te ne morejo zavesti. Z njimi se sprijazni, še posebej, ker na majhnih območjih pomorska karta daje natančno podobo narave (sl. 5).

    Po drugi strani pa pomorska karta močno olajša reševanje nalog navigacijske prakse. To je edina vrsta karte, na kateri je pot ladje na stalni poti prikazana kot ravna črta. Slediti "konstantni smeri" pomeni vedno držati eno smer, en določen "loks", z drugimi besedami, iti tako, da prečkate vse poldnevnike pod enakim kotom. Toda to pot ("loxodrome") je mogoče prikazati kot ravno črto samo na zemljevidu, na katerem so vsi meridiani ravne črte, vzporedne druga z drugo. In ker se na globusu krogi zemljepisne širine sekajo z meridiani pod pravim kotom, bi morali biti na takšnem zemljevidu krogi zemljepisne širine ravne črte, pravokotne na črte meridianov. Skratka, pridemo natanko do koordinatne mreže, ki je značilnost morske karte.




    riž. 5. Navtični ali Mercatorjev zemljevid sveta. Na takih zemljevidih ​​so dimenzije kontur daleč od ekvatorja močno pretirane. Katera je na primer večja: Grenlandija ali Avstralija? (odgovor v besedilu)


    Naklonjenost jadralcev Mercatorjevim zemljevidom je zdaj razumljiva. Ker hoče navigator določiti smer, po kateri naj se pelje do določenega pristanišča, na končne točke poti prisloni ravnilo in izmeri kot, ki ga sklene z meridiani. Če bo navigator ves čas v tej smeri na odprtem morju, bo ladjo natančno pripeljal do cilja. Vidite, da je "loksodrom" sicer ne najkrajša in ne najbolj ekonomična, a v določenem pogledu zelo priročna pot za mornarja. Če želite doseči, na primer, od Rta dobrega upanja do južne konice Avstralije (glej sliko 1), morate vedno držati isto smer S 87 °.50 ". Medtem, da bi ladjo pripeljali na isto končna točka najkrajša pot(v skladu z "ortodromijo") je potrebno, kot je razvidno iz slike, nenehno spreminjati potek plovila: začeti s tečajem S 42 °, 50 "in končati s tečajem N 53 °, 50 « (v tem primeru najkrajša pot niti ni izvedljiva – naslanja se na antarktično ledeno steno).

    Obe poti - vzdolž "loksodroma" in vzdolž "ortodromije" - sovpadata le, če je pot vzdolž velikega kroga na morski karti prikazana kot ravna črta: pri gibanju vzdolž ekvatorja ali vzdolž poldnevnika. V vseh drugih primerih so te poti drugačne.

    Dijkstrajev algoritem je grafični algoritem, ki ga je leta 1959 izumil nizozemski znanstvenik Edsger Dijkstra. Poišče najkrajše poti od ene od tock grafa do vseh ostalih. Algoritem deluje samo za grafe brez robov negativne teže.

    Razmislite o izvedbi algoritma na primeru grafa, prikazanega na sliki.

    Naj bo treba najti najkrajše razdalje od 1. oglišča do vseh ostalih.

    Krogi označujejo vozlišča, črte označujejo poti med njimi (robovi grafa). Številke oglišč so označene v krogih, njihova "cena" - dolžina poti - je navedena nad robovi. Ob vsaki točki je označena rdeča oznaka - dolžina najkrajše poti do te točke od točke 1.

    Prvi korak. Razmislite o koraku v Dijkstrovem algoritmu za naš primer. Najmanjšo oznako ima vozlišče 1. Točke 2, 3 in 6 so njegovi sosedi.

    Prvi sosed točke 1 je točka 2, ker je dolžina poti do nje minimalna. Dolžina poti do njega skozi točko 1 je enaka vsoti vrednosti oznake točke 1 in dolžine roba, ki poteka od 1. do 2., to je 0 + 7 = 7. To je manj kot trenutna oznaka točke 2, neskončnost, tako da je nova oznaka 2. točke 7.

    Podobno operacijo izvedemo še z dvema sosedoma 1. vozlišča - 3. in 6.

    Vsi sosedi vozlišča 1 so preverjeni. Trenutna minimalna razdalja do vrha 1 velja za dokončno in ni predmet revizije (dejstvo, da je res tako, je prvi dokazal E. Dijkstra). Prečrtajte ga na grafu, da označite, da je bilo to vozlišče obiskano.

    Drugi korak. Korak algoritma se ponovi. Spet najdemo "najbližje" od neobiskanih vozlišč. To je oglišče 2, označeno s 7.

    Spet poskušamo zmanjšati oznake sosedov izbranega vozlišča in jih poskušati prenesti skozi 2. vozlišče. Sosedje točke 2 so točke 1, 3 in 4.

    Prvi (po vrstnem redu) sosed točke 2 je točka 1. Vendar je bila že obiskana, zato s 1. točko ne naredimo ničesar.

    Naslednji sosed točke 2 je točka 3, saj ima najmanjšo oznako vozlišč, označenih kot neobiskana. Če greste do njega skozi 2, bo dolžina takšne poti enaka 17 (7 + 10 = 17). Toda trenutna oznaka tretjega vozlišča je 9, kar je manj kot 17, zato se oznaka ne spremeni.

    Druga soseda točke 2 je točka 4. Če greste do nje skozi 2., bo dolžina takšne poti enaka vsoti najkrajše razdalje do 2. točke in razdalje med točko 2 in 4, tj. , 22 (7 + 15 = 22) . Od 22<, устанавливаем метку вершины 4 равной 22.

    Vsi sosedje točke 2 so pregledani, razdaljo do nje zamrznemo in jo označimo kot obiskano.

    Tretji korak. Ponovimo korak algoritma z izbiro vozlišča 3. Po njegovi »obdelavi« dobimo naslednje rezultate:

    Naslednji koraki. Ponovimo korak algoritma za preostala vozlišča. To bodo oglišča 6, 4 in 5.

    Zaključek izvajanja algoritma. Algoritem se zaključi, ko ni več mogoče obdelati nobene točke. V tem primeru so vse točke prečrtane, vendar je napačno domnevati, da bo tako v katerem koli primeru - nekatere točke lahko ostanejo neprečrtane, če jih ni mogoče doseči, tj. če je graf nepovezan. Rezultat algoritma je viden na zadnji sliki: najkrajša pot od točke 1 do 2 je 7, do 3 je 9, do 4 je 20, do 5 je 20, do 6 je 11.

    Implementacija algoritma v različnih programskih jezikih:

    C++

    #include "stdafx.h" #include uporaba imenskega prostora std; const int V=6; // Dijkstrajev algoritem 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("pause>>void"); )

    Pascal

    program DijkstraAlgorithm; usescrt; constV=6; inf=100000; tip vektor=matrika celih števil; var start: integer; const GR: niz celih števil=((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)); (Dijkstrajev algoritem) procedure Dijkstra(GR: niz celih števil; st: celo število); var count, index, i, u, m, min: celo število; razdalja: vektor; obiskano: niz logičnih vrednosti; beginm:=st; za i:=1 do V začni razdaljo[i]:=inf; obiskano[i]:=false; konec; razdalja:=0; za count:=1 do V-1 naredite begin min:=inf; for i:=1 to V do if (not visited[i]) and (distance[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) in (razdalja [u]<>inf) in (razdalja[u]+GR inf then writeln(m," > ", i," = ", distance[i]) else writeln(m," > ", i," = ", "pot ni na voljo"); konec; (glavni programski blok) begin clrscr; write("Začetno vozlišče >> "); branje (začetek); Dijkstra (GR, začetek); konec.

    Java

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.StringTokenizer; javni razred Rešitev ( private static int INF = Integer.MAX_VALUE / 2; private int n; //število točk v digrafu private int m; //število lokov v digrafu private ArrayList adj; //seznam sosednosti zasebni ArrayList utež; // teža roba v digrafu uporabljena zasebna logična vrednost; //matrika za shranjevanje informacij o opravljenih in neopravljenih vrhovih private int dist; //matrika za shranjevanje razdalje od začetne točke //matrika prednikov, potrebnih za obnovitev najkrajše poti od začetne točke private int pred; int začetek; //začetna točka, od katere se išče razdalja do vseh ostalih private BufferedReader cin; zasebni PrintWriter cout; zasebni tokenizer StringTokenizer; //postopek za zagon Dijkstrinega algoritma iz začetne točke private void dejkstra(int s) ( dist[s] = 0; //najkrajša razdalja do začetne točke je 0 za (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(); ) //inicializacija seznama, ki hrani uteži robov weight = new ArrayList[n]; za (int i = 0; i< n; ++i) { weight[i] = new ArrayList(); ) //branje grafa, podanega s seznamom robov za (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(); } }

    Druga možnost:

    Uvozi java.io.*; import java.util.*; javni razred Dijkstra ( zasebni statični končni Graph.Edge GRAPH = ( new Graph.Edge("a", "b", 7), new Graph.Edge("a", "c", 9), new Graph.Edge( "a", "f", 14), nov Graph.Edge("b", "c", 10), nov Graph.Edge("b", "d", 15), nov Graph.Edge("c" ", "d", 11), nov Graph.Edge("c", "f", 2), nov Graph.Edge("d", "e", 6), nov Graph.Edge("e", "f", 9), ); zasebni statični končni niz START = "a"; zasebni statični končni niz END = "e"; javni statični void main(String args) ( Graph g = new Graph(GRAPH); g.dijkstra (START); g.printPath(END); //g.printAllPaths(); ) ) razred Graph ( zasebni končni zemljevid graf; // preslikava imen vozlišč v objekte Vertex, zgrajena iz nabora Robov /** En rob grafa (uporablja ga samo konstruktor Graph) */ javni statični razred Rob ( javni končni niz v1, v2; javni končni int dist; public Edge(String v1, String v2, int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** Eno oglišče grafa, skupaj s preslikavami v sosednja oglišča */ javni statični razred Vertex izvaja Comparable (javno končno ime niza; javno int dist = Integer.MAX_VALUE; // MAX_VALUE se domneva, da je neskončno javno Vertex prejšnje = nič; javni končni zemljevid sosedje = nov HashMap<>(); public Vertex(String name) ( this.name = name; ) private void printPath() ( if (this == this.previous) ( System.out.printf("%s", this.name); ) else if ( this.previous == null) ( System.out.printf("%s(nedoseženo)", 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); ) ) /** Gradi graf iz nabora robov * / public Graph(Edge edges) ( graph = new HashMap<>(robovi.dolžina); //en prehod za iskanje vseh tock za (Edge e: edges) ( if (!graph.containsKey(e.v1)) graph.put(e.v1, new Vertex(e.v1)); if (!graph. containsKey(e.v2)) graph.put(e.v2, new Vertex(e.v2)); ) //drug prehod za nastavitev sosednjih tock za (Edge e: robovi) ( graph.get(e.v1). neighbours.put(graph.get(e.v2), e.dist); //graph.get(e.v2).neighbours.put(graph.get(e.v1), e.dist); // tudi naredite to za neusmerjen graf ) ) /** Zažene dijkstra z uporabo podane izvorne točke */ public void dijkstra(String startName) ( if (!graph.containsKey(startName)) ( System.err.printf("Graf ne vsebuje začetno točko \"%s\"\n", startName); return; ) final Vertex source = graph.get(startName); NavigableSet q = nov TreeSet<>(); // nastavitev vozlišč za (Vertex v: graph.values()) ( v.previous = v == source ? source: null; v.dist = v == source ? 0: Integer.MAX_VALUE; q.add( v); ) dijkstra(q); ) /** Implementacija dijkstrinega algoritma z uporabo binarne kopice. */ private void dijkstra(final NavigableSet q) ( Vozlišče u, v; medtem ko (!q.isEmpty()) ( u = q.pollFirst(); // vozlišče z najkrajšo razdaljo (prva ponovitev bo vrnila izvor) if (u.dist == Integer.MAX_VALUE) break; // lahko prezremo u (in vsa druga preostala vozlišča), ker so nedosegljiva //poglejmo razdalje do vsakega soseda za (Map.Entry a: u.neighbours.entrySet()) ( v = a.getKey(); //sosed v tej ponovitvi final 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

    #vključi #vključi #vključi //#define BIG_EXAMPLE typedef struct node_t node_t, *heap_t; typedef struct rob_t rob_t; struct edge_t ( vozlišče_t *nd; /* cilj tega roba */ edge_t *sibling;/* za posamično povezan seznam */ int len; /* stroški roba */); struct node_t ( edge_t *edge; /* posamično povezan seznam robov */ node_t *via; /* kjer je prejšnje vozlišče na najkrajši poti */ dvojna razdalja; /* razdalja od izvornega vozlišča */ char name; /* the, er , ime */ int heap_idx; /* povezava do položaja kopice za posodabljanje razdalje */); /* --- upravljanje robov --- */ #ifdef BIG_EXAMPLE # definiraj BLOK_SIZE (1024 * 32 - 1) #else # definiraj BLOK_SIZE 15 #endif edge_t *edge_root = 0, *e_next = 0; /* Ne ozirajte se na zadeve upravljanja pomnilnika, niso bistvene. Pretvarjajte se, da je 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->len = d; e_next ->sibling = a->edge; a->edge = e_next; ) void free_edges() ( for (; edge_root; edge_root = e_next) ( e_next = edge_root.sibling; free(edge_root); ) ) /* --- prednostna čakalna vrsta --- */ heap_t *heap; int heap_len; void set_dist(node_t *nd, node_t *via, double d) ( int i, j; /* že pozna boljšo pot */ if (nd->via && d >= nd->dist) return; /* najdi obstoječi vnos kopice ali ustvari novega */ nd->dist = d; nd->via = via; i = nd->heap_idx; if (!i) i = ++heap_len; /* upheap */ za (; i > 1 && nd->dist< heap->dist; i = j) (kup [i] = kup [j])-> heap_idx = i; kopica[i] = nd; nd->heap_idx = i; ) vozlišče_t * pop_queue() ( vozlišče_t *nd, *tmp; int i, j; if (!heap_len) vrne 0; /* odstranite vodilni element, povlecite repni element tja in navzdol kopico */ nd = kopica; tmp = kopica; za (i = 1; i< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > kopica->dist) j++; if (heap[j]->dist >= tmp->dist) break; (kup [i] = kup [j])-> heap_idx = i; ) kopica[i] = tmp; tmp->heap_idx = i; vrnitev nd; ) /* --- Dijkstra stvari; nedosegljiva vozlišča ne bodo nikoli naredila včakalna vrsta --- */ void calc_all(node_t *start) ( node_t *lead; edge_t *e; set_dist(start, start, 0); while ((lead = pop_queue())) for (e = lead->edge; e; e = e->sibling) set_dist(e->nd, lead, lead->dist + e->len); ) void show_path(node_t *nd) ( if (nd->via == nd) printf( "%s", nd->name); else if (!nd->via) printf("%s(nedoseženo)", nd->name); else ( show_path(nd->via); printf("- > %s(%g) ", nd->name, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # definiraj N_NODES ("f" - "a" + 1) node_t * vozlišča = calloc(sizeof(node_t), N_NODES); for (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, "cost" => $edge); $neighbours[$edge] = array("end" => $edge, "cost" => $edge); ) $vozlišča = array_unique($vozlišča); foreach ($vertices kot $vertex) ( $dist[$vertex] = INF; $previous[$vertex] = NULL; ) $dist[$source] = 0; $Q = $točke; while (count($Q) > 0) ( // TODO - Poiščite hitrejši način za pridobitev najmanj $min = INF; foreach ($Q kot $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

    iz zbirk uvoz namedtuple, čakalna vrsta iz pprint uvoz pprint kot pp inf = float("inf") Edge = namedtuple("Edge", "start, end, cost") class Graph(): def __init__(self, edges): self .edges = edges2 = self.vertices = set(sum(( for e in edges2), )) def dijkstra(self, source, dest): potrdi izvor v self.vertices dist = (vozlišče: inf za točko v self.vertices ) prejšnji = (vozlišče: Nič za vozlišče v self.vozliščih) dist = 0 q = self.vozlišča.copy() neighbours = (vozlišče: set() za vozlišče v self.vozliščih) za začetek, konec, stroške v self. robovi: neighbours.add((end, cost)) #pp(neighbours) while q: u = min(q, key=lambda vertex: dist) q.remove(u) if dist[u] == inf ali u = = dest: break za v, stroški v sosedih[u]: alt = dist[u] + stroški če 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"]