Znate li zašto je dalje u ravnoj liniji nego u luku? Određivanje udaljenosti između dvaju usporednih pravaca Kolika je najkraća udaljenost između dviju točaka

Put duž isprekidane linije na slici je kraći od puta duž pune linije. A sada malo detaljnije na primjeru morskih ruta:

Ako plovite stalnim kursom, tada je putanja kretanja broda duž Zemljina površina bit će krivulja koja se u matematici zove logaritamskispirala.

U navigaciji se ova složena linija dvostruke zakrivljenosti naziva loksodromija, što na grčkom znači "kosi hod".

Međutim, najkraća udaljenost između dviju točaka na globusu mjeri se duž luka velike kružnice.

Luk velikog kruga dobiva se kao trag iz sjecišta zemljine površine s ravninom koja prolazi kroz središte Zemlje, uzeta kao lopta.

U navigaciji se veliki kružni luk naziva veliki krug, što znači "ravno trčanje". Druga značajka velikog kruga je da siječe meridijane pod različitim kutovima (slika 29).

Razlika u udaljenosti između dviju točaka na zemljinoj površini duž loksodroma i ortodrome od praktične je važnosti samo za velika prelaženja oceana.

U normalnim uvjetima ta se razlika zanemaruje i plovidba se odvija stalnim kursom, tj. po loksodromu.

Da bismo izveli jednadžbu, uzimamo loksodromije (Sl. 30, a) dvije točkice ALI i NA, udaljenost između njih je jednostavno mala. Crtajući meridijane i paralelu kroz njih, dobivamo elementarni pravokutni sferni trokut ABC. U tom trokutu kut koji tvori sjecište meridijana i paralele je prav, a kut PnAB jednak kursu broda K. Katet AC predstavlja segment meridijanskog luka i može se izraziti

gdje R - radijus Zemlje uzet kao sfera;

Δφ - elementarni prirast geografske širine (razlika geografskih širina).

noga SW predstavlja lučni segment paralelan

gdje je r - radijus paralele;

Δλ - elementarna razlika zemljopisnih dužina.

Iz trokuta OO 1 C može se naći da

Zatim u konačnom obliku nogu SW može se izraziti ovako:

Uz pretpostavku elementarnog sfernog trokuta ABC za stan, napišite

Nakon smanjenja R i zamjenom elementarnih malih inkremenata koordinata infinitezimalnima, imamo

Dobiveni izraz integriramo u rasponu od φ 1, λ 1 do φ 2, λ 2 uzimajući u obzir vrijednost tgK kao konstantnu vrijednost:

Na desnoj strani imamo tablični integral. Nakon što zamijenimo njegovu vrijednost, dobivamo jednadžbu loksodroma na lopti

Analiza ove jednadžbe omogućuje nam da izvučemo sljedeće zaključke:

Na kursevima od 0 i 180 °, loksodrom se pretvara u luk velike kružnice - meridijan;

Na kursevima od 90 i 270 °, loksodrom se poklapa s paralelom;

Loksodrom prelazi svaku paralelu samo jednom, a svaki meridijan nebrojeno puno puta. oni. spiralno se približava polu, ne doseže ga.

Plovidba u stalnom kursu, odnosno po loksodromu, iako to nije najkraća udaljenost između dviju točaka na Zemlji, predstavlja znatnu pogodnost za navigatora.

Zahtjevi za pomorsku navigacijsku kartu mogu se formulirati na temelju prednosti plovidbe duž loksodroma i rezultata analize njegove jednadžbe kako slijedi.

1. Loksodrom, koji siječe meridijane pod stalnim kutom, trebao bi biti prikazan kao ravna linija.

2. kartografska projekcija, koji se koristi za izradu karata, mora biti jednakokutan tako da kursevi, smjerovi i kutovi na njemu odgovaraju njihovoj vrijednosti na tlu.

3. Meridijani i paralele, kao i linije kursa 0, 90, 180° i 270°, moraju biti međusobno okomite ravne linije.

Najkraća udaljenost između dviju danih točaka na površini Zemlje, uzeta kao sfera, je manji od lukova velike kružnice koji prolaze kroz te točke. Osim u slučaju kada brod prati meridijan ili ekvator, veliki krug siječe meridijane pod različitim kutovima. Stoga brod koji slijedi takvu krivulju mora cijelo vrijeme mijenjati svoj kurs. Praktično je praktičnije slijediti kurs koji s meridijanima čini stalni kut i koji se na karti u Mercatorovoj projekciji prikazuje ravnom linijom - loksodromom. Međutim, na velikim udaljenostima razlika u duljini ortodrome i loksodrome doseže značajnu vrijednost. Stoga se u takvim slučajevima računa ortodroma i na njoj se označavaju međutočke, između kojih se pliva po loksodromi.

Kartografsku projekciju koja udovoljava navedenim zahtjevima predložio je nizozemski kartograf Gerard Cramer (Mercator) 1569. godine. U čast svog tvorca projekcija je nazvana Mercator.

A tko želi dobiti još više zanimljiva informacija Saznajte više Izvorni članak nalazi se na web stranici InfoGlaz.rf Link na članak iz kojeg je napravljena ova kopija -

DALJINA, daljine, usp. 1. Prostor koji odvaja dvije točke, jaz između nečega. Najkraća udaljenost između dviju točaka na ravnoj liniji. Živi od nas na udaljenosti od dva kilometra. “Komandant ih je pustio unutra na najbližoj udaljenosti... Rječnik Ushakov

udaljenost- imenica, s., upotreba. često Morfologija: (ne) što? udaljenost za što? udaljenost, (vidjeti) što? udaljenost nego? udaljenost, što? o udaljenosti; pl. što? udaljenost, (ne) što? udaljenosti, zašto? daljine, (vidjeti) što? udaljenost nego? udaljenosti... Rječnik Dmitrieva

udaljenost- ja; usp. Prostor koji razdvaja dvije točke, dva predmeta itd., jaz između nekoga, nego l. Najkraća rijeka između dvije točke. R. od kuće do škole. Povucite se do obližnje rijeke. Na udaljenosti od jednog metra, raširenih ruku. Znati nešto, osjetiti nešto. na…… enciklopedijski rječnik

udaljenost- ja; usp. vidi također udaljenost a) Prostor koji dijeli dvije točke, dva predmeta itd., razmak između nekoga, nego l. Najkraća udaljenost između dvije točke. Udaljenost od kuće do škole. Povucite se na malu udaljenost / nie ... Rječnik mnogih izraza

GEOMETRIJA- grana matematike koja proučava svojstva raznih oblika (točaka, linija, kutova, dvodimenzionalnih i trodimenzionalnih predmeta), njihovu veličinu i međusobni položaj. Radi lakšeg poučavanja, geometrija se dijeli na planimetriju i geometriju tijela. NA…… Collier Encyclopedia

Navigacija*

Navigacija- odjel za navigaciju (vidi), završavajući prezentacijom načina određivanja mjesta broda na moru, pomoću kompasa i dnevnika (vidi). Odrediti mjesto broda na moru znači staviti na kartu točku u kojoj se brod nalazi ovaj trenutak nalazi se.…… Enciklopedijski rječnik F.A. Brockhaus i I.A. Efron

COGEN- (Cohen) Hermann (1842. 1918.) njemački filozof, utemeljitelj i najistaknutiji predstavnik marburške škole neokantijanizma. Glavna djela: 'Kantova teorija iskustva' (1885), 'Kantovo opravdanje etike' (1877), 'Kantovo opravdanje estetike' (1889), 'Logika… ...

Kant Imanuel- Životni put i spisi Kanta Immanuel Kant rođen je u Konigsbergu (danas Kaliningrad) u Istočnoj Pruskoj 1724. Otac mu je bio sedlar, a majka domaćica, šestero njihove djece nije doživjelo punoljetnost. Kant se uvijek sjećao svojih roditelja s ... ... Zapadna filozofija od svojih početaka do danas

KANTOVA KRITIČKA FILOZOFIJA: DOKTRINA O SPOSOBNOSTIMA- (La philosophie critique de Kant: Doctrines des facultes, 1963) od Deleuzea. Opisujući transcendentalnu metodu u uvodu, Deleuze napominje da Kant shvaća filozofiju kao znanost o odnosu sveg znanja prema bitnim ciljevima... ... Povijest filozofije: Enciklopedija

princip farme- osnovni princip geometrijske optike (Vidi Geometrijska optika). Najjednostavniji oblik F. p. je izjava da se zraka svjetlosti uvijek širi u prostoru između dviju točaka na stazi duž koje je vrijeme njezina prolaska manje od ... Velik sovjetska enciklopedija

(nacrtna geometrija)
  • CD (CXDX, C2D2) prikazan kao točka C5 = D5 A5B5 jednako...
    (nacrtna geometrija)
  • Određivanje udaljenosti dviju paralelnih ravnina
    Određivanje udaljenosti dviju paralelnih ravnina u općem položaju 01| x zgodno ga je svesti na problem određivanja udaljenosti između istih dviju ravnina, transformiranih u položaj projiciranih. U ovom slučaju, udaljenost između ravnina definirana je kao okomica između linija, ...
    (nacrtna geometrija)
  • Određivanje udaljenosti između dviju linija koje se sijeku
    Ako želite odrediti najkraću udaljenost između dviju linija koje se sijeku, morate dva puta promijeniti sustave ravnina projekcije. Prilikom rješavanja ovog problema izravna CD (CXDX, C2D2) prikazan kao točka C5 = D5(Slika 198). Udaljenost od ove točke do projekcije A5B5 jednako...
    (nacrtna geometrija)
  • Kut između dviju ravnih linija koje se sijeku
    Ovo je kut između dviju linija koje se sijeku i koje su paralelne s podacima. Dakle, ovaj zadatak je sličan prethodnom. Da biste ga riješili, potrebno je uzeti proizvoljnu točku i kroz nju povući dva pravca paralelna sa zadanim kosopravama, te pomoću transformacije projekcije odrediti traženi kut....
    (Osnove nacrtne geometrije. Kratki tečaj i zbirka zadataka.)
  • Određivanje udaljenosti između dva paralelna pravca
    Problem se rješava metodom dvostruke zamjene ravnina projekcija. U završnoj fazi jedna od ravnina projekcije mora biti okomita na jednu od linija koje se sijeku. Tada je najkraći razmak između njih određen vrijednošću segmenta okomice na drugu zakrivljenu liniju (slika 199)....
    (nacrtna geometrija)
  • Nakon što je kredom ocrtao dvije točke na ploči, učitelj mladom učeniku daje zadatak: nacrtati najkraći put između obje točke.

    Učenik, nakon razmišljanja, marljivo povlači vijugavu liniju između njih.

    - To je najkraći put! učiteljica je iznenađena. - Tko te to naučio?

    - Moj otac. On je taksist.

    Crtež naivnog školarca je, naravno, anegdotalan, ali ne biste se nasmiješili kad bi vam rekli da je točkasti luk na sl. 1 je najkraći put od Rta dobre nade do južnog vrha Australije!

    Još je upečatljivija sljedeća izjava: prikazana na sl. 2 povratna putovanja od Japana do Panamskog kanala kraća je od ravne crte povučene između njih na istoj karti!

    Riža. 1. Uključeno morska karta najkraći put od Rta dobre nade do južnog vrha Australije nije označen ravnom linijom ("loksodrom"), već krivuljom ("ortodromija")


    Sve ovo izgleda kao šala, ali u međuvremenu pred vama su nepobitne istine, dobro poznate kartografima.




    Riža. 2. Čini se nevjerojatnim da je zakrivljeni put koji povezuje Yokohamu na pomorskoj karti s Panamskim kanalom kraći od ravne linije povučene između istih točaka


    Da bismo razjasnili problem, treba reći nekoliko riječi o kartama općenito, a posebno o pomorskim kartama. Crtanje dijelova zemljine površine na papir nije lak zadatak, čak ni u principu, jer je Zemlja kugla, a poznato je da se nijedan dio sferne površine ne može rasporediti na ravninu bez nabora i lomova. Nehotice se mora pomiriti s neizbježnim iskrivljenjima na kartama. Izumljeno je mnogo načina crtanja karata, ali nisu sve karte lišene nedostataka: neke imaju iskrivljenja jedne, druge druge vrste, ali nema karata bez iskrivljenja.

    Pomorci koriste karte nacrtane prema metodi starog nizozemskog kartografa i matematičara iz 16. stoljeća. Mercator. Ova metoda se naziva Mercatorova projekcija. Pomorsku kartu lako je prepoznati po pravokutnoj mreži: meridijani su na njoj prikazani kao niz paralelnih ravnih linija; krugovi zemljopisne širine - također u ravnim crtama okomito na prvi (vidi sl. 5).

    Zamislite sada da želite pronaći najkraći put od jedne oceanske luke do druge na istoj paraleli. Na oceanu su svi putevi dostupni, a tamo se uvijek može putovati najkraćim putem ako se zna kako leži. U našem slučaju prirodno je misliti da najkraći put ide uzduž paralele na kojoj leže obje luke: uostalom, na karti je to ravna crta, a što može biti kraće od ravnog puta! Ali varamo se: put uz paralelu uopće nije najkraći.

    Doista: na površini kugle, najkraća udaljenost između dviju točaka je luk velikog kruga koji ih povezuje. Ali krug paralele mali krug. Luk velike kružnice je manje zakrivljen od luka bilo koje male kružnice povučene kroz iste dvije točke: veći radijus odgovara manjoj zakrivljenosti. Povucite konac na globusu između naše dvije točke (usp. sl. 3); uvjerit ćete se da uopće ne leži uz paralelu. Čvrsta nit - neosporan pokazatelj najkraći put, a ako se ne poklapa s paralelom na globusu, tada na pomorskoj karti najkraći put nije označen ravnom linijom: podsjetimo da su krugovi paralela na takvoj karti prikazani ravnim crtama, svaka linija koja ne podudaraju se s ravnom linijom zavoj .



    Riža. 3. Jednostavan način da pronađete stvarno najkraći put između dvije točke: između tih točaka trebate povući konac na globusu


    Nakon rečenog postaje jasno zašto je najkraća staza na pomorskoj karti prikazana ne kao ravna, već kao zakrivljena linija.

    Kažu da pri odabiru smjera za Nikolaevskaya (sada Oktyabrskaya) željeznička pruga vodile su se beskrajne rasprave o tome na koji način ga položiti. Sporovima je stala na kraj intervencija cara Nikole I., koji je problem riješio doslovce "direktno": linijom je povezao Petrograd s Moskvom. Da je to učinjeno na Mercatorovoj karti, bilo bi to neugodno iznenađenje: umjesto ravne linije, cesta bi bila krivulja.

    Tko ne izbjegava kalkulacije, može se jednostavnom računicom uvjeriti da je put koji nam se na karti čini zakrivljenim zapravo kraći od onog koji smo spremni smatrati ravnim. Neka naše dvije luke leže na 60. paraleli i međusobno su udaljene 60°. (Postoje li takve dvije luke stvarno nije bitno za izračun.)



    Riža. 4. Izračunu udaljenosti između točaka A i B na lopti po luku paralele i po luku velike kružnice


    Na sl. 4 boda O - centar globus, AB - luk kruga zemljopisne širine na kojem leže luke A i B; u njezinih 60°. Središte kruga geografske širine je u točki IZ Zamislite to iz centra O globusa je kroz iste luke povučen veliki kružni luk: njegov radijus OB = OA = R; proći će blizu nacrtanog luka AB, ali ne poklapa se.

    Izračunajmo duljinu svakog luka. Budući da bodovi ALI i NA leže na zemljopisnoj širini od 60°, zatim radijusi OA i OV pomiriti se OS(osi globusa) kut od 30°. U pravokutnom trokutu ASO noga AC (=r), koja leži nasuprot kutu od 30° jednaka je polovici hipotenuze dd;

    sredstva, r=R/2 Dužina luka AB je jedna šestina duljine kruga zemljopisne širine, a budući da ovaj krug ima polovicu duljine velikog kruga (što odgovara polovici polumjera), tada je duljina luka malog kruga



    Da bismo sada odredili duljinu luka velike kružnice povučene između istih točaka (tj. najkraći put između njih), moramo znati veličinu kuta AOW. Akord KAO, oduzimajući luk do 60 ° (mali krug), je stranica pravilnog šesterokuta upisana u isti mali krug; zato AB \u003d r \u003d R / 2

    Crtanje ravne linije od, središte povezivanja O globus sa sredinom D akordi AB, dobiti pravokutni trokut ODA, gdje je kut D- ravno:

    DA= 1/2 AB i OA=R.

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

    Odavde nalazimo (prema tablicama):

    =14°28",5

    i zbog toga

    = 28°57".

    Sada nije teško pronaći željenu duljinu najkraće staze u kilometrima. Izračun se može pojednostaviti ako se sjetimo da je duljina minute velikog kruga na zemaljskoj kugli

    Saznajemo da je put po krugu širine, prikazanom na pomorskoj karti ravnom linijom, 3333 km, a put po velikom krugu - po krivulji na karti - 3213 km, tj. 120 km kraći.

    Naoružani koncem i globusom pri ruci, lako možete provjeriti točnost naših crteža i uvjeriti se da lukovi velikih krugova doista leže kao što je prikazano na crtežima. Prikazano na sl. 1 kao da je "ravna" morska ruta od Afrike do Australije 6020 milja, a "krivulja" - ​​5450 milja, tj. kraća za 570 milja, odnosno 1050 km. "Izravna" zračna ruta na pomorskoj karti od Londona do Šangaja prolazi kroz Kaspijsko jezero, dok stvarno najkraća ruta leži sjeverno od St. Jasno je kakvu ulogu ova pitanja imaju u uštedi vremena i goriva.

    Ako se u eri plovidbenog broda vrijeme nije uvijek cijenilo - tada se "vrijeme" još nije smatralo "novcem", tada se s pojavom parnih brodova mora platiti za svaku dodatnu potrošenu tonu ugljena. Zato danas brodovi plove stvarno najkraćim putem, često koristeći karte napravljene ne u Mercatoru, već u takozvanoj "centralnoj" projekciji: na tim su kartama lukovi velikih kružnica prikazani kao ravne linije.

    Zašto su se onda bivši moreplovci služili takvim varljivim kartama i birali nepovoljne putove? Pogrešno je misliti da u stara vremena nisu znali za danas naznačeno obilježje pomorskih karata. Stvar se objašnjava, naravno, ne time, već činjenicom da karte iscrtane po Mercatorovoj metodi, uz neugodnosti, imaju itekako dragocjene koristi za nautičare. Takva karta, prvo, prikazuje odvojene male dijelove zemljine površine bez izobličenja, čuvajući kutove konture. Tome ne proturječi činjenica da se s udaljenošću od ekvatora sve konture primjetno rastežu. Na visokim geografskim širinama rastezanje je toliko značajno da morska karta nadahnjuje osobu koja nije upoznata s njegovim značajkama s potpuno lažnom idejom o pravoj veličini kontinenata: čini se da je Grenland iste veličine kao Afrika, Aljaska je veća od Australije, iako je Grenland 15 puta manji od Afrike, a Aljaska zajedno s Grenlandom upola manja od Australije. Ali mornar koji je dobro upoznat s ovim značajkama karte ne može ih zavesti. On ih podnosi, tim više što na malim površinama morska karta daje točnu sliku prirode (sl. 5).

    S druge strane, pomorska karta uvelike olakšava rješavanje zadataka plovidbene prakse. Ovo je jedina vrsta karata na kojima je putanja broda na stalnom kursu prikazana kao ravna linija. Slijediti "konstantan kurs" znači uvijek se držati jednog smjera, jednog određenog "loksfa", drugim riječima, ići tako da prelaziš sve meridijane pod jednakim kutom. Ali ovaj put ("loxodrome") može se prikazati kao ravna linija samo na karti na kojoj su svi meridijani ravne linije paralelne jedna s drugom. A budući da se na globusu krugovi zemljopisne širine sijeku s meridijanima pod pravim kutom, tada bi na takvoj karti krugovi zemljopisne širine trebali biti ravne linije okomite na linije meridijana. Ukratko, dolazimo upravo do koordinatne mreže koja je karakteristična za pomorsku kartu.




    Riža. 5. Pomorska ili Mercatorova karta globusa. Na takvim su kartama dimenzije kontura daleko od ekvatora jako preuveličane. Što je, na primjer, veće: Grenland ili Australija? (odgovor u tekstu)


    Sklonost mornara prema Mercatorovim kartama sada je razumljiva. U želji da odredi kurs koji treba slijediti pri dolasku u zadanu luku, navigator prisloni ravnalo na krajnje točke puta i mjeri kut koji ono čini s meridijanima. Držeći se na otvorenom moru cijelo vrijeme u ovom smjeru, navigator će točno dovesti brod do cilja. Vidite da je "loxodrome" iako ne najkraći i ne najekonomičniji, ali u određenom pogledu vrlo pogodan put za nautičara. Da bi se stiglo, na primjer, od Rta dobre nade do južnog vrha Australije (vidi sliku 1), mora se uvijek držati isti kurs S 87 °.50 ". U međuvremenu, kako bi se brod doveo na isto mjesto konačna točka najkraći put(prema "ortodromi"), potrebno je, kao što se vidi sa slike, kontinuirano mijenjati kurs plovila: početi od kursa S 42 °, 50" i završiti kursom N 53 °, 50 “ (u ovom slučaju, najkraći put nije niti izvediv – upire se u antarktički ledeni zid).

    Oba puta - duž "loksodroma" i duž "ortodromije" - podudaraju se samo kada je put duž velikog kruga prikazan na pomorskoj karti kao ravna linija: kada se kreće duž ekvatora ili duž meridijana. U svim drugim slučajevima ti su putovi drugačiji.

    Dijkstrin algoritam je grafov algoritam koji je izumio nizozemski znanstvenik Edsger Dijkstra 1959. godine. Pronalazi najkraće putove od jednog od vrhova grafa do svih ostalih. Algoritam radi samo za grafove bez bridova negativne težine.

    Razmotrimo izvođenje algoritma na primjeru grafa prikazanog na slici.

    Neka se traži najkraća udaljenost od 1. vrha do svih ostalih.

    Krugovi označavaju vrhove, linije označavaju putove između njih (rubovi grafa). Brojevi vrhova označeni su u krugovima, njihova "cijena" - duljina staze - naznačena je iznad rubova. Pored svakog vrha označena je crvena oznaka - duljina najkraćeg puta do tog vrha od vrha 1.

    Prvi korak. Razmotrimo korak u Dijkstrinom algoritmu za naš primjer. Oznaku minimuma ima vrh 1. Vrhovi 2, 3 i 6 su njegovi susjedi.

    Prvi susjed vrha 1 je pak vrh 2, jer je duljina puta do njega minimalna. Duljina puta do njega kroz vrh 1 jednaka je zbroju vrijednosti oznake vrha 1 i duljine brida koji ide od 1. do 2., odnosno 0 + 7 = 7. To je manje od trenutna oznaka vrha 2, beskonačnost, tako da je nova oznaka 2. vrha 7.

    Sličnu operaciju izvodimo s druga dva susjeda 1. vrha - 3. i 6.

    Provjeravaju se svi susjedi čvora 1. Trenutna minimalna udaljenost do vrha 1 smatra se konačnom i ne podliježe reviziji (činjenicu da je to doista tako prvi je dokazao E. Dijkstra). Precrtajte ga na grafu da označite da je ovaj vrh posjećen.

    Drugi korak. Korak algoritma se ponavlja. Opet nalazimo "najbliži" od neposjećenih vrhova. Ovo je vrh 2 označen sa 7.

    Opet pokušavamo reducirati oznake susjeda odabranog vrha, pokušavajući ih proći kroz 2. vrh. Susjedi vrha 2 su vrhovi 1, 3 i 4.

    Prvi (po redu) susjed vrha 2 je vrh 1. Ali on je već posjećen, tako da ne radimo ništa s 1. vrhom.

    Sljedeći susjed vrha 2 je vrh 3, budući da ima minimalnu oznaku vrhova označenih kao neposjećeni. Ako idete do njega kroz 2, tada će duljina takvog puta biti jednaka 17 (7 + 10 = 17). Ali trenutna oznaka trećeg vrha je 9, što je manje od 17, tako da se oznaka ne mijenja.

    Još jedan susjed vrha 2 je vrh 4. Ako idete do njega kroz 2., tada će duljina takvog puta biti jednaka zbroju najkraće udaljenosti do 2. vrha i udaljenosti između vrhova 2 i 4, tj. , 22 (7 + 15 = 22) . Od 22<, устанавливаем метку вершины 4 равной 22.

    Svi susjedi vrha 2 su pregledani, zamrzavamo udaljenost do njega i označavamo ga kao posjećenog.

    Treći korak. Ponavljamo korak algoritma odabirom vrha 3. Nakon njegove “obrade” dobivamo sljedeće rezultate:

    Sljedeći koraci. Ponavljamo korak algoritma za preostale vrhove. To će biti vrhovi 6, 4 i 5, redom.

    Završetak izvođenja algoritma. Algoritam se završava kada više nije moguće obraditi vrhove. U ovom su primjeru svi vrhovi prekriženi, ali pogrešno je pretpostaviti da će to biti slučaj u bilo kojem primjeru - neki vrhovi mogu ostati neprecrtani ako ih se ne može dosegnuti, tj. ako je graf nepovezan. Rezultat algoritma vidljiv je na zadnjoj slici: najkraći put od vrha 1 do 2 je 7, do 3 je 9, do 4 je 20, do 5 je 20, do 6 je 11.

    Implementacija algoritma u različitim programskim jezicima:

    C++

    #include "stdafx.h" #include korištenje imenskog prostora std; const int V=6; // Dijkstrin algoritam 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"); )

    Pascal

    program DijkstraAlgorithm; usescrt; constV=6; inf=100000; tip vector=niz cijelih brojeva; var start: integer; const GR: niz cijelih brojeva=((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)); (Dijkstrin algoritam) procedure Dijkstra(GR: niz cijelih brojeva; st: cijeli broj); var broj, indeks, i, u, m, min: cijeli broj; udaljenost: vektor; posjećeno: niz booleovih; beginm:=st; za i:=1 do V započnite udaljenost[i]:=inf; posjećeno[i]:=false; kraj; udaljenost:=0; za count:=1 do V-1 do begin min:=inf; za i:=1 do V učiniti ako (nije posjećeno[i]) i (udaljenost[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) i (udaljenost[u]<>inf) i (udaljenost[u]+GR inf then writeln(m," > ", i," = ", distance[i]) else writeln(m," > ", i," = ", "ruta nedostupna"); kraj; (glavni programski blok) begin clrscr; write("Početni čvor >> "); čitanje (početak); Dijkstra(GR, početak); kraj.

    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; javna klasa Rješenje ( private static int INF = Integer.MAX_VALUE / 2; private int n; //broj vrhova u digrafu private int m; //broj lukova u digrafu private ArrayList adj; //popis susjedstva privatni ArrayList težina; // težina ruba u digrafu private boolean used; //niz za pohranjivanje informacija o prijeđenim i neprolaznim vrhovima private int dist; //niz za pohranjivanje udaljenosti od početnog vrha //niz predaka potrebnih za vraćanje najkraće staze od početnog vrha private int pred; int početak; //početni vrh, od kojeg se traži udaljenost do svih ostalih private BufferedReader cin; privatni PrintWriter cout; privatni StringTokenizer tokenizer; //procedura za pokretanje Dijkstrinog algoritma iz početnog vrha private void dejkstra(int s) ( dist[s] = 0; //najkraća udaljenost do početnog vrha 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(); ) //inicijaliziranje popisa koji pohranjuje težine rubova weight = new ArrayList[n]; za (int i = 0; i< n; ++i) { weight[i] = new ArrayList(); ) //čitaj graf dat popisom rubova 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 opcija:

    Uvezi java.io.*; import java.util.*; javna klasa Dijkstra ( privatni statički konačni Graph.Edge GRAPH = ( new Graph.Edge("a", "b", 7), new Graph.Edge("a", "c", 9), new Graph.Edge( "a", "f", 14), novi Graph.Edge("b", "c", 10), novi Graph.Edge("b", "d", 15), novi Graph.Edge("c" ", "d", 11), novi Graph.Edge("c", "f", 2), novi Graph.Edge("d", "e", 6), novi Graph.Edge("e", "f", 9), ); privatni statički konačni niz START = "a"; privatni statički konačni niz END = "e"; javni statički void main(String args) ( Graph g = new Graph(GRAPH); g.dijkstra (START); g.printPath(END); //g.printAllPaths(); ) ) klasa Graph ( privatna konačna karta grafikon; // preslikavanje imena vrhova u objekte Vertex, izgrađenih od skupa rubova /** Jedan rub grafa (koristi ga samo konstruktor grafa) */ javna statička klasa Edge ( javni finalni niz v1, v2; javni finalni int dist; public Edge(String v1, String v2, int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** Jedan vrh grafa, zajedno s preslikavanjem na susjedne vrhove */ javna statička klasa Vertex implementira Comparable ( public final String name; public int dist = Integer.MAX_VALUE; // MAX_VALUE pretpostavlja se da je beskonačnost public Vertex previous = null; public final Map susjedi = novi 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(unreached)", 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 od skupa rubova * / public Graph(Edge edges) ( graph = new HashMap<>(rubovi.duljina); //jedan prolaz za pronalaženje svih vrhova 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)); ) //još jedan prolaz za postavljanje susjednih vrhova za (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); // također učinite ovo za neusmjereni graf ) ) /** Izvodi dijkstra koristeći specificirani izvorni vrh */ public void dijkstra(String startName) ( if (!graph.containsKey(startName)) ( System.err.printf("Graf ne sadrži početni vrh \"%s\"\n", startName); return; ) final Vertex izvor = graph.get(startName); NavigableSet q = novi TreeSet<>(); // postavljanje vrhova za (Vertex v: graph.values()) ( v.previous = v == izvor ? izvor: null; v.dist = v == izvor ? 0: Integer.MAX_VALUE; q.add( v); ) dijkstra(q); ) /** Implementacija dijkstrinog algoritma korištenjem binarne gomile. */ private void dijkstra(final NavigableSet q) ( Vertex u, v; while (!q.isEmpty()) ( u = q.pollFirst(); // vrh s najkraćom udaljenosti (prva iteracija će vratiti izvor) if (u.dist == Integer.MAX_VALUE) break; // možemo ignorirati u (i sve druge preostale vrhove) jer su nedostupni //pogledati udaljenosti do svakog susjeda za (Map.Entry a: u.neighbours.entrySet()) ( v = a.getKey(); //susjed u ovoj iteraciji 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

    #uključi #uključi #uključi //#define BIG_EXAMPLE typedef struct node_t node_t, *heap_t; typedef struct rub_t edge_t; struct edge_t ( node_t *nd; /* cilj ovog ruba */ edge_t *sibling;/* za pojedinačno povezanu listu */ int len; /* trošak ruba */ ); struct node_t ( edge_t *edge; /* pojedinačno povezana lista rubova */ node_t *via; /* gdje je prethodni čvor na najkraćem putu */ double dist; /* udaljenost od izvornog čvora */ char name; /* the, er , ime */ int heap_idx; /* veza na poziciju hrpe za ažuriranje udaljenosti */ ); /* --- upravljanje rubovima --- */ #ifdef BIG_EXAMPLE # define BLOCK_SIZE (1024 * 32 - 1) #else # define BLOCK_SIZE 15 #endif edge_t *edge_root = 0, *e_next = 0; /* Ne obazirite se na stvari upravljanja memorijom, one nisu bitne. Pretvarajte 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); ) ) /* --- prioritetni red čekanja --- */ heap_t *heap; int heap_len; void set_dist(node_t *nd, node_t *via, double d) ( int i, j; /* već je znao bolji put */ if (nd->via && d >= nd->dist) return; /* pronađite postojeći unos hrpe ili kreirajte novi */ 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) (hrpa[i] = hrpa[j])->hrpa_idx = i; hrpa[i] = nd; nd->heap_idx = i; ) node_t * pop_queue() ( node_t *nd, *tmp; int i, j; if (!heap_len) return 0; /* uklonite vodeći element, povucite repni element tamo i downheap */ nd = hrpa; tmp = hrpa; za (i = 1; i< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > hrpa->dist) j++; if (heap[j]->dist >= tmp->dist) break; (hrpa[i] = hrpa[j])->hrpa_idx = i; ) gomila[i] = tmp; tmp->heap_idx = i; povratak nd; ) /* --- Dijkstra stvari; nedostižni čvorovi nikada neće napraviti u red --- */ 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(unreached)", nd->name); else ( show_path(nd->via); printf("- > %s(%g) ", nd->name, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # definiraj N_ČVOROVA ("f" - "a" + 1) čvor_t * čvorovi = calloc(sizeof(node_t), N_NODES); za (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); $susjedi[$edge] = array("end" => $edge, "cost" => $edge); ) $vertices = array_unique($vertices); foreach ($vertices kao $vertex) ( $dist[$vertex] = INF; $previous[$vertex] = NULL; ) $dist[$source] = 0; $Q = $vrhovi; while (count($Q) > 0) ( // TODO - Pronađite brži način da dobijete minimum $min = INF; foreach ($Q kao $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";


    Piton

    iz kolekcija import namedtuple, queue from pprint import pprint as pp inf = float("inf") Edge = namedtuple("Edge", "start, end, cost") class Graph(): def __init__(self, edges): self .edges = edges2 = self.vertices = set(sum((( za e u edges2), )) def dijkstra(self, source, dest): potvrdi izvor u self.vertices dist = (verteks: inf za vrh u self.vertices ) prethodni = (vrh: Ništa za vrh u self.vertices) dist = 0 q = self.vertices.copy() susjedi = (vrh: set() za vrh u self.vertices) za početak, kraj, trošak u self. rubovi: susjedi.add((kraj, cijena)) #pp(susjedi) while q: u = min(q, ključ=lambda vertex: dist) q.remove(u) if dist[u] == inf ili u = = dest: break za v, trošak u susjedima[u]: alt = dist[u] + trošak ako je 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"]