Determinarea distanței dintre două paralele drepte. Știți de ce, imediat, mai mult decât arcul? Care este cea mai scurtă distanță între două puncte

Prin provocarea a două puncte de pe tablă, profesorul oferă o sarcină școlară tinere: trageți cea mai scurtă cale între ambele puncte.

Studentul, gândirea, îndepărtează cu sârguință o linie de înfășurare între ele.

- Asta e cel mai scurt drum! - profesor surprins. - Cine te-a învățat atât de mult?

- Tatăl meu. Este un șofer de taxi.

Desenul unui învățător naiv, desigur, anecdotal, dar nu ați zâmbi dacă vi sa spus că un arc punctat în fig. 1 - Cea mai scurtă de la capă de speranță bună la vârful sudic al Australiei!

Următoarea declarație este încă izbitoare: descrisă în fig. 2 O cale circulară de la Japonia la canalul Panama pe scurt, o linie dreaptă petrecută între ele pe aceeași hartă!

Smochin. 1. Pe harta maritimă, cea mai scurtă cale de la capă de speranță bună la vârful sudic al Australiei nu este o linie dreaptă ("Lokocodromia"), ci o curbă ("ortodromine")


Toate acestea arată ca o glumă și între timp în fața ta - adevărurile necontestate, bine-cunoscute de carografe.




Smochin. 2. Se pare incredibil ca traseul curbilinar care se leaga pe harta marina a Yokohama cu canalul panaman, pe scurt, linia dreaptă efectuată între aceleași puncte


Pentru a clarifica întrebarea, va trebui să spuneți câteva cuvinte despre hărțile în general și despre marine în special. Imaginea de pe părțile de hârtie ale suprafeței Pământului nu este ușoară, chiar și în principiu, deoarece pământul este o minge și se știe că nici o parte a suprafeței cu bile nu poate fi implementată în avion fără pliuri și pauze. Insecuritate, trebuie să vă ocupați de distorsiunile inevitabile pe hărți. Există multe modalități de a trage cărți, dar toate cărțile nu sunt libere de defecte: există distorsiuni de un fel, pe alte tipuri, dar nu există carduri fără distorsiuni.

Marinarii se bucură de hărți extrase de metoda unui vechi cardograf olandez și matematică din secolul al XVI-lea. Mercator. Această metodă se numește "Proiecția Mercator". Aflați cu ușurință cartela marină prin grila dreptunghiulară: meridianele sunt descrise pe ea sub forma unei serii de linii drepte paralele; Cercurile litness sunt, de asemenea, linii drepte perpendiculare la primul (vezi figura 5).

Imaginați-vă acum că aveți nevoie pentru a găsi cea mai scurtă cale de la un port ocean la altul situată pe aceeași paralelă. Pe ocean, toate căile sunt disponibile, iar călătoria acolo prin cea mai scurtă cale este întotdeauna posibil dacă știți cum funcționează. În cazul nostru, este natural să credem că cea mai scurtă cale merge de-a lungul paralelului, pe care ambele porturi se află: la urma urmei, pe hartă este o linie dreaptă și ceea ce ar putea fi mai scurt! Dar ne confruntăm cu: Calea în paralel nu este deloc cea mai scurtă.

De fapt: pe suprafața mingii, cea mai scurtă distanță dintre două puncte are un arc mare de cerc care le leagă. Dar cercul este paralel - mic un cerc. Arcul unui cerc mare este mai puțin răsucite decât arcul oricărui mic cerc petrecut prin aceleași două puncte: mai puțin curbură este responsabilă pentru o rază mai mare. Tensiune pe firul globului dintre cele două puncte (Miercul. Fig.3); Vă veți asigura că nu se încadrează în paralel. Firul întins este indicatorul incontestabil al celei mai scurte căi, și dacă nu se potrivește cu globul cu o paralelă, atunci pe harta maritimă cea mai scurtă cale nu este denumită de o linie dreaptă: amintiți că cercurile de paralele sunt descrise pe o astfel de Harta cu linii drepte, fiecare linie, care nu coincide cu o linie dreaptă, există curba .



Smochin. 3. O modalitate simplă de a găsi o cale cu adevărat mai scurtă între două puncte: este necesar să trageți firul pe glob între aceste elemente


După ce sa spus, devine clar de ce cea mai scurtă cale de pe cardul maritim nu este o linie dreaptă, ci o linie de curbă.

Ei spun că atunci când alegeți o direcție pentru calea ferată Nikolaev (acum oktyabrskaya), litigiile nesfârșite au fost efectuate în ce mod de al deschide. Sfârșitul litigiilor a pus intervenția lui Tsar Nicholas I, care a decis sarcina de literalmente "direct": Legat de Petersburg cu Moscova pe linie. Dacă sa făcut pe un card Mercator, ar fi o surpriză de confuzie: în loc de un drum drept ar fi venit la curbă.

Oricine evită calculele, că calculul simplu se poate asigura că calea care ne pare pe harta lui Krivoy, de fapt, cu cel mai scurt dintre cei care suntem dispuși să luăm în considerare direct. Lăsați ambele porturi să stea pe paralel 60 și sunt separate de o distanță de 60 °. (Există în realitate astfel de două porturi - pentru a calcula, desigur, indiferenți.)



Smochin. 4. Pentru a calcula distanțele dintre punctele A și B pe un castron pe paralel arc și pe arcul unui cerc mare


În fig. 4 puncte DESPRE -centrul globului Ab.arcul cercului latitude pe care se află portul A și B; îneste de 60 °. Latitude Circle Center - la punct DINImaginați-vă că din centru DESPREglobul a fost realizat prin același port al arcului unui cerc mare: raza sa Ob \u003d oa \u003d r;se va apropia de arcul tras Ab.dar nu coincide cu ea.

Calculați lungimea fiecărui arc. Ca punct DARși ÎNsituată pe lățimea de 60 °, apoi raza Oa.și Ov.c. OS.(Axa globului) unghi de 30 °. Într-un triunghi dreptunghiular ASO.cathe. Ca (\u003d r),un colț de 30 ° este egal cu jumătate din hipotenuse SA;

inseamna r \u003d r / 2 Durata Dougie. Au.aceasta este o lungime de șasezeci de latitudine, și din moment ce acest cerc are de două ori mai mult decât un cerc mare (conform unei raze mai mici), apoi lungimea arcului cercului mic



Pentru a determina acum lungimea arcului unui cerc mare, petrecut între aceleași puncte (adică cea mai scurtă cale între ele), este necesar să înveți magnitudinea unghiului Ah.Coardă La fel de, strângerea arcului la 60 ° (cerc mic), există o parte a hexagonului drept, inscripționat în același cerc mic; asa de AV \u003d R \u003d R / 2

După ce a cheltuit drept Od,centrul de conectare DESPREmijloc D.coarde. Ab.avem un triunghi dreptunghiular Oda,În cazul în care colțul D -drept:

Da \u003d 1/2 AB și OA \u003d R.

sinaod \u003d AD: AO \u003d R / 4: R \u003d 0,25

De aici găsim (conform tabelelor):

\u003d 14 ° 28 ", 5

prin urmare,

\u003d 28 ° 57 ".

Acum nu este dificil să găsiți lungimea dorită a celei mai scurte căi în kilometri. Calculul poate fi simplificat dacă vă amintiți că lungimea unui minut al cercului mare al globului este mo

Învățăm că calea în cercul latitudinii, descrisă pe harta mării a liniei drepte, este de 3333 km, iar calea spre cercul mare - de către curba pe harta - 3213 km, adică, 120 km mai scurtă.

Înarmați cu un fir și având un glob la îndemână, puteți verifica cu ușurință corectitudinea desenelor noastre și asigurați-vă că arcele cercurilor mari se epuizează într-adevăr așa cum se arată în desene. Imaginea în fig. 1 Ca și cum maritimul "drept" din Africa în Australia este de 6020 mile, iar "curba" este de 5450 de mile, adică, pe scurt, 570 de mile sau 1050 km. "Drept" pe căile aeriene de mare de la Londra la Shanghai taie Marea Caspică, între timp, ca într-adevăr cea mai scurtă cale curge la nord de St. Petersburg. Este clar ce rol vor juca aceste întrebări în economisirea timpului și a combustibilului.

Dacă epoca de expediere a navigației nu a fost întotdeauna tratată cu timpul, - apoi "timp" nu a fost încă considerată "bani", atunci odată cu apariția navelor cu aburi, este necesar să plătiți pentru fiecare tonă consumată inutilă a cărbunelui. De aceea, în zilele noastre, instanțele sunt efectuate pe cea mai scurtă cale, folosind cele mai des hărți făcute în mercamale, dar în așa-numita proeminență "centrală": pe aceste cărți, arcul mari de cercuri sunt descrise de linii drepte.

De ce au folosit navigatorii anteriori cărți atât de înșelătoare și alese căi neprofitabile? Se înșeală să credem că în vremurile vechi nu știau despre caracteristicile specificate ale cărților marine. Cazul este explicat, bineînțeles, nu prin faptul că, prin faptul că hărțile trase de metoda Mercatorului au avut împreună cu inconvenientele sunt foarte valoroase pentru beneficiile marinilor. O astfel de card, în primul rând, descrie separarea unor părți mici ale suprafeței Pământului fără distorsiuni, păstrând colțurile conturului. Acest lucru nu este contrar faptul că, cu eliminarea de la ecuator, toate contururile sunt întinse considerabil. În latitudini mari, întinderea este atât de mult încât cartela maritimă inspiră o persoană necunoscută cu caracteristicile sale, o înțelegere complet falsă a valorii adevărate a continentelor: Groenlanda pare ca aceeași magnitudine ca Africa, Alaska este mai mult Australia, deși este Groenlanda De 15 ori mai puțin Africa și Alaska împreună cu Groenlanda de două ori mai puține Australia. Dar marinarul care este familiarizat cu aceste trăsături ale cardului, ele nu pot fi înșelătoare. El se pune cu ei, mai ales că, în secțiunile mici, cardul marin oferă o similitudine exactă a naturii (figura 5).

Dar cardul maritim facilitează considerabil soluționarea sarcinilor practicii de navigație. Aceasta este singura rasă a cărților pe care calea navei, mergând pe un curs permanent, este descrisă de o linie dreaptă. Înseamnă a păstra un "curs permanent" - înseamnă a păstra intens o direcție, o anumită "rumba", cu alte cuvinte, să meargă astfel încât să traverseze toți meridianele într-un colț egal. Dar această cale ("loccodromia") poate fi descrisă linia directă numai pe o astfel de hartă pe care toți meridianele sunt linii drepte una cu cealaltă. Și dincolo de glob, cercurile latitudine se intersectează cu meridianele în unghi drept, apoi pe o astfel de hartă și cercurile de latitudine ar trebui să fie linii drepte perpendiculare pe liniile meridianelor. Pe scurt, ajungem tocmai la grila de coordonate care este caracteristica caracteristică a cardului marin.




Smochin. 5. Harta marină sau Mercator a globului. Dimensiunile contururilor la distanță de ecuator sunt foarte exagerate pe astfel de hărți. Ce, de exemplu, mai mult: Groenlanda sau Australia? (Răspuns în text)


Estate navigatorii la cardurile Mercator este acum clar. Dorind să determine cursul, care trebuie păstrat, mergând la portul numit, navigatorul aplică un conducător la punctele finale ale căii și măsoară unghiul compus din ea cu meridiane. Ținând în permanență marea deschisă, navigatorul conduce în mod evident vasul la țintă. Vedeți că "Locodromia" - deși nu este cel mai scurt și nu cel mai economic, dar într-un raport cunoscut este foarte convenabil pentru marinar. Pentru a ajunge, de exemplu, din capul unei speranțe bune până la vârful sudic al Australiei (vezi figura 1), trebuie să țineți întotdeauna un curs de schimb de 87 °, 50 ". Între timp, pentru a aduce nava la același element final În cel mai scurt mod (prin ortodromia "), trebuie să văd cum este văzută din figură, schimbând continuu cursul navei: începeți de la cursul S 42 °, 50" și cum cu cursul N 53 °, 50 "(în acest caz, cea mai scurtă cale chiar nu se potrivește - se sprijină pe peretele înghețat al orașului Antarctica).

Ambele căi - în "loccodromia" și în conformitate cu "Ortodromia" - coincid numai atunci când calea într-un cerc mare este descrisă pe harta mării a liniei drepte: când se deplasează de-a lungul ecuatorului sau a meridianului. În toate celelalte cazuri, acestea sunt diferite.

(Geometria descriptivă)
  • CD (CXDX, C2D2) descris ca un punct C5 \u003d D5. A5V5. in aceeasi masura...
    (Geometria descriptivă)
  • Determinarea distanței dintre două planuri paralele
    Definiția distanței dintre două planuri paralele de poziție generală 01 | X. Este convenabil să reduceți problema pentru a determina distanța dintre aceleași două avioane, care au fost convertite în poziția de proiecție. În acest caz, distanța dintre avioane este determinată ca o perpendiculară între dreaptă, ...
    (Geometria descriptivă)
  • Determinarea distanței dintre două țări transversale drepte
    Dacă aveți nevoie să determinați cea mai scurtă distanță între două directe transversale, trebuie să schimbați de două ori sistemul de avioane de proiecție. Când rezolvați această sarcină este dreaptă CD (CXDX, C2D2) descris ca un punct C5 \u003d D5. (Fig.198). Distanța de la acest punct la proiecție A5V5. in aceeasi masura...
    (Geometria descriptivă)
  • Unghiul dintre două linii drepte în țară
    Acesta este unghiul dintre două date drepte, paralele intersectate. Astfel, această sarcină este similară cu cea precedentă. Pentru ao rezolva, trebuie să luați un punct arbitrar și prin el există două linii drepte paralele cu direcția de trecere specificată și utilizând conversia proiecțiilor pentru a determina unghiul dorit ....
    (Bazele geometriei proiectate. Curs scurt și colecții de sarcini.)
  • Determinarea distanței dintre două paralele drepte
    Sarcina este rezolvată prin metoda de înlocuire a avioanelor proiecțiilor. La etapa finală, unul dintre proiectoarele proiecțiilor ar trebui să fie perpendicular pe unul dintre minciunile încrucișate. Apoi, cea mai mică distanță dintre ele este determinată de dimensiunea perpendiculară la o altă dreaptă (figura 199) ....
    (Geometria descriptivă)
  • Distanța, distanțele, cf. 1. Spațiul care separă două puncte, decalajul dintre ceva. Cea mai scurtă distanță între două puncte într-o linie dreaptă. Trăiește de la noi la o distanță de doi kilometri. "Comandantul le-a împins la cea mai apropiată distanță ... Dicționar explicativ ushakov.

    distanţă - Sub., S., Upottr. Adesea morfologia: (nu) ce? Distanțe Ce? Distanța, (vezi) Ce? Distanța decât? Distanță, ce zici de? oh distanța; Mn. ce? Distanțe, (Nu) Ce? Distanțe Ce? Distanțe, (vezi) Ce? Distanțe decât? Distanțe ... Dmirieva Dmirieva

    distanţă - i; cf. Spațiu care separă două puncte, două subiecte etc., decalajul dintre care decât l. Cel mai scurt r. Între două puncte. R. de la domiciliu la școală. Să vină la râul Închidere. La o distanță de un metru alungită. Știți că l. Simțiți că l. pe… … Enciclopedice dicționar

    distanţă - i; cf. Vedeți TZH. Distanța a) spațiu care separă două puncte, două obiecte etc., diferența dintre care decât l. Cea mai scurtă distanță dintre cele două puncte. Scăpați de la școală la școală. Pentru a închide o distanță Dicționar de multe expresii

    GEOMETRIE - secțiunea de matematică angajată în studiul proprietăților diferitelor figuri (puncte, linii, unghiuri, obiecte bidimensionale și tridimensionale), dimensiunea și locația reciprocă. Pentru confortul de predare, geometria este împărțită în planimetrie și stereometru. În ... ... Enciclopedia Culoare

    Navigare*

    Navigare - Departamentul de expediere (a se vedea), care concluzionează o declarație de modalități de a determina locul navei în mare, folosind busola și lag (a se vedea). Determinați locul navei în mare, înseamnă să aplicați punctul din punctul în care nava este localizată în prezent. ... ... Dicționar enciclopedică f.a. Brockhaus și i.a. Efron.

    Kohen. - (Cohen) Herman (1842 1918) Filozoful german, fondatorul și reprezentantul proeminent al Școlii de Neokantismism din Marburg. Lucrări principale: Teoria "experienței lui Kant" (1885), "Justificare a Cantului de etică" (1877), "Justificare a Cantului esteticii" (1889), "Logic ... ...

    Kant Immanuel. - Calea și scrierile de viață ale lui Immanuel Kant s-au născut în Königsberg (acum Kaliningrad) în Prusia de Est în 1724. Tatăl era un bot, iar mama unei gospodării, cei șase dintre copiii lor nu au trăit la vârsta matură. Kant a reamintit întotdeauna părinții ... ... Filozofia occidentală din surse până în prezent

    Filozofia critică a lui Kant: Doctrina abilităților - (La Filosofie Critique de Kant: Doctrines des Facultes, 1963) Lucrează pentru a delecta. Caracterizarea în introducerea metodei transcendentale, eliminarea remedierilor pe care Kant înțelege filosofia ca știință privind atitudinea oricărei cunoștințe în scopuri esențiale ... ... Istoria filozofiei: enciclopedia

    Principiul fermei - Principiul de bază al opticii geometrice (vezi optica geometrică). Cea mai simplă formă de F.P. - Aprobarea ca fasciculul de lumină să se răspândească întotdeauna în spațiu între două puncte de-a lungul căii prin care timpul său este mai mic decât ... Enciclopedia sovietică mare

    Algoritmul Dakstra (Algoritmul English Dijkstra) este un algoritm la grafic, inventat de Olanda Edsger Dikstroy în 1959. Găsește cele mai scurte căi de la una dintre vârfurile graficului către toate celelalte. Algoritmul funcționează numai pentru grafice fără greutate negativă RADIM.

    Luați în considerare execuția algoritmului pe exemplul graficului prezentat în figură.

    Lăsați-l să fie obligat să găsească cea mai scurtă distanță de primul vârf al tuturor celorlalte.

    Cercurile indică vârfurile, liniile - calea dintre ele (număr de ribr). În cercurile marcate numerele vârfurilor, peste margini sunt indicate de "prețul" lor - lungimea căii. Alături de fiecare vârf de roșu marcat eticheta - lungimea celei mai scurte calea spre acest vârf al vârfului 1.

    Primul pas. Luați în considerare etapa algoritmului de didicare pentru exemplul nostru. Eticheta minimă are un vârf 1. Vecinii săi sunt vârfuri 2, 3 și 6.

    Primul, la rândul său, a vârfurilor vârfului 1 - Top 2, deoarece lungimea calea către acesta este minimă. Lungimea calea în el prin vertexul 1 este egală cu suma valorii etichetei vârfului 1 și lungimea marginii venite de la 1 la 2, adică 0 + 7 \u003d 7. Este Mai puțin decât eticheta curentă a vârfului 2, infinit, astfel încât noua etichetă este a 2-a vârfurile sunt 7.

    O operație similară se face cu alți doi vecini ai primului vertex - al treilea și al 6-lea.

    Toate vârfurile vertexului 1 sunt verificate. Distanța minimă actuală față de vertexul 1 este considerată a fi definitivă și revizuirea nu este supusă (ceea ce a dovedit pentru prima dată E. Dyakstra). Am tras-o din grafic pentru a observa că acest top este vizitat.

    Al doilea pas. Etapa algoritmului este repetată. Noi găsim din nou "cel mai apropiat" de la vârfurile nedorite. Acesta este un vertex 2 etichetat 7.

    Încercați din nou să reduceți semnele vecinilor vârfului selectat, încercând să intrăm în ele prin intermediul celui de-al doilea vârf. Vecinii din vârfurile 2 sunt vârfurile 1, 3 și 4.

    Primul (în ordine) Un vecin al vertexului 2 este vârful 1. Dar este deja vizitat, așa că nu facem nimic cu primul vertex.

    Următorul vecin al Vertexului 2 este Vertex 3, deoarece are o etichetă minimă de la vârfurile marcate ca fiind vizitate. Dacă mergeți la el în 2, atunci lungimea unei astfel de căi va fi egală cu 17 (7 + 10 \u003d 17). Dar marca actuală a celui de-al treilea vârf este de 9, iar acest lucru este mai mic de 17, astfel încât eticheta nu se schimbă.

    Un alt vecin al vertexului 2 este vârful 4. Dacă mergeți la el prin al doilea, atunci lungimea unei astfel de căi va fi egală cu suma celei mai scurte distanțe până la vârful 2 și distanța dintre vârfurile 2 și 4 , adică 22 (7 + 15 \u003d 22). Din 22.<, устанавливаем метку вершины 4 равной 22.

    Toate vârfurile vârfului 2 sunt vizualizate, înghețați distanța și o marchim așa cum este vizitat.

    Al treilea pas. Repetăm \u200b\u200betapa algoritmului selectând vârful 3. După "procesarea" sa obținem rezultatele:

    Următorii pași. Repetăm \u200b\u200betapa algoritmului pentru celelalte noduri. Acestea vor fi verticalele 6, 4 și, respectiv, ordinea.

    Finalizarea executării algoritmului. Algoritmul termină munca atunci când nu puteți procesa nici un vertex. În acest exemplu, toate vârfurile sunt înecate, dar se vor confunda să credem că va fi așa în orice exemplu - unele noduri pot rămâne decuplate dacă este imposibil să o obțineți, adică dacă numărul este neconcludent. Rezultatul algoritmului este vizibil în ultima figură: Cea mai scurtă cale de la vârful 1 până la al doilea este de 7, până la 3 - 9, până la 4-20, până la data de 5-20, până la 6 - 11.

    Implementarea algoritmului în diferite limbi de programare:

    C ++.

    #Include "stdafx.h" #include Utilizarea spațiului de nume STD; const in v \u003d 6; // algoritmul DAEKSTRA void Dijkstra (int gr [v] [v], int st st) (int distanta [v], conta, index, i, u, m \u003d st + 1; bool a vizitat [v]; pentru (i \u003d 0; I. "< "<\u003e "; Cin \u003e\u003e Start; Dijkstra (GR, Start-1); Sistem (" Pauză \u003e\u003e Void ");)

    Pascal.

    Program dijkstraalgorithm; Utilizează CRT; const v \u003d 6; INF \u003d 100000; Tipul Vektor \u003d Gama de Integer; VAR Start: Integer; Const gr: matrice de integer \u003d ((0, 1, 4, 0, 2, 0), (0, 0, 0, 9, 0, 0), (4, 0, 0, 7, 0, 0), (0, 9, 7, 0, 0, 2), (0, 0, 0, 0, 0, 8), (0, 0, 0, 0, 0, 0)); (Dikstra algoritm) Procedură Dijkstra (GR: Gama de integrați; ST: număr întreg); Var Count, Index, I, U, M, Min: Integer; Distanță: Vektor; Vizitat: Gama de boolean; Începe m: \u003d st; Pentru i: \u003d 1 la v Începeți distanța [I]: \u003d INF; Vizitat [i]: \u003d fals; Sfârșit; Distanță: \u003d 0; Pentru numărul: \u003d 1 până la v-1 începe min: \u003d INF; Pentru i: \u003d 1 la v Do dacă (nu este vizitat [i]) și (distanța [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 (distanța [U]<>iNF) și (Distanța [U] + GR inf apoi Writeln (m, "\u003e", eu, "\u003d", distanța [i]) altfel weleln (m, "", "" "," traseul nu este disponibil "); Sfârșit; (Blocul de program) începe CLRSCR; Scrieți ("Începând sus \u003e\u003e"); Citiți (Start); Dijkstra (GR, Start); Sfârșit.

    Java.

    Importați java.io.buftendReader; Import java.io.ioexception; Importați java.io.inputstreamReader; Importați java.io.printinter; import java.util.arraylist; Importați java.util.arrays; Importați java.util.stringtokenizer; Soluție de clasă publică (Private static Inf \u003d Integer.Max_Value / 2; Private INT N; // Numărul de noduri în contigraf privat INT M; // Numărul de arte în declanșarea orgrafului privat Adj; // Lista adiacenței arrazizului privat GREUTATE; // greutatea coastei în Bolean Private Orgraf utilizat; // o matrice pentru stocarea informațiilor despre disțialul privat intals și verticalele; // matrice pentru stocarea distanței de la vârful inițial // o serie de strămoși necesară pentru a restabili cea mai scurtă cale de la locația privată PREP; Int Start; // Începeți partea superioară, care caută o distanță cu toate celelalte CIN-uri cu buffered private; Printwriter privat Cout; Urmărirea articulatorului privat; // Procedura de lansare a algoritmului DAEKSTER de la vertexul de pornire Vibul privat Dejkstra (INT S) (DIST [S] \u003d 0; // Cea mai scurtă distanță față de vertexul de pornire este 0 pentru (INTTER \u003d 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(); ) // inițializarea listei în care sunt stocate greutățile coastelor \u003d noul arrailist [N]; pentru (int i \u003d 0; i< n; ++i) { weight[i] = new ArrayList(); ) // citiți graficul specificat de lista de margini pentru (int i \u003d 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(); } }

    Altă opțiune:

    Import Java.IO. *; Importați java.util. *; Clasa publică Dijkstra (Private static Final Graph.ege Graph \u003d (New Graph.ege ("A", "B", 7), New Graph.ege ("A", "C", 9), New Graph.ege ( "A", "F", 14), New Graph.ege ("B", "C", 10), New Graph.ege ("B", "D", 15), New Graph.ege ("C "," D ", 11), New Graph.ege (" C "," F ", 2), New Graph.ege (" D "," E ", 6), New Graph.ege (" E ", "F", 9); ); G.PrintPath; //g.printallpaths ();)) Graficul de clasă (harta finală privată Grafic; // cartografierea denumirilor de vârf la obiecte de vârf, construite dintr-un set de margini / ** o margine a graficului (String Final Final V1, v2; Final Final Public Dist; Edge publică (șir v1, șir v2, Int) ( this.v1 \u003d v1; the.v2 \u003d v2; the.dist \u003d dist;)) / ** un vârf al graficului, complet cu cartografii la vârfurile vecine * / Publicul de clasă statică de clasă unelte comparabile (Numele de șir finală public; public int dist \u003d integer.max_value; // max_value presupus a fi infinit publică vertex anterior \u003d null; harta finală publică Vecinii \u003d New Hashmap<>(); Vertexul public (Numele șirului) Volumul privat PrintPath () (dacă \u003d\u003d acest.previous) (sistem.out.printf ("% s", acest nume);) altfel dacă (acest lucru.previous \u003d\u003d null) (sistem. Out.printf ("% s (nerecuperat)", acest nume);) altceva (acest lucru.previous.rorintpath (); sistem.out.printf ("-\u003e% s (% d)", acest nume, acest lucru .DIST);)) Public Int Compară (Vertex Altele) (Return Integer.compare (DIST, Other.Dist);))) / ** Construiți un grafic dintr-un set de margini * / Graficul public (grafic \u003d Hashmap nou<>(Margini. Lungime); // o trecere pentru a găsi toate nodurile pentru (Edge E: margini) (dacă (! Grafic.containskey (e.v1)) grafic.put (E.v1, NEX VERTEX (E.V1)); dacă (! Graficul. CONSULTY (E.V2)) Grap.put (E.v2, New Vertex (E.V2));) // O altă trecere la setarea vârfurilor vecine pentru (grafic.Get (E.v1). Vecinări. obține (e.v2), e.dist); //graph.neighbours.put), e.dist); // face acest lucru pentru un grafic nedirecționat)) / ** rulează Dijkstra folosind a Vertex sursă specificată * / Volumul public Dijkstra (Numele de pornire a șirului) (dacă (! Graficul.containskey (StartName)) (System.err.printf ("Graficul nu conține vertexul de pornire \\"% s \\ "\\ n", nume de pornire) ; retur;) Final Vertex Source \u003d grafic.Get (StartName); Navigableset Q \u003d New Treeset<>(); // vârfuri de configurare pentru (Vertex v: grafic.Values \u200b\u200b()) (v.previous \u003d v \u003d\u003d sursă? Sursa: null; V.Dist \u003d v \u003d\u003d sursa? 0: Integer.Max_Value; Q. Adăugați (v);) Dijkstra (q); ) / ** Implementarea algoritmului lui Dijkstra utilizând un heap binar. * / Volumul privat Dijkstra (Final Navigableset q) (vertex u, v; în timp ce (q.empty ()) (u \u003d q.pollfinți (); // vertex va retur sursa (prima iterație va retur sursa) dacă (u.dist \u003d\u003d integer.max_value) Pauză; // putem ignora u (și orice alte noduri rămase), deoarece acestea sunt nerezolabile // uitați-vă la distanțe către fiecare vecin pentru (hartă.entry R: U.Neighbourss.entryset ()) (v \u003d a.getkey (); // vecinul din această Itterare INT alternatist \u003d u.dist +gevalue (); dacă (alternativist< 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.

    #Include. #Include. #Include. // # definesc big_example tipdef struct node_t node_t, * heap_t; Typedef struct Edged_t Edge_t; struct Edge_t (NODE_T * ND; / * țintă a acestei margini * / EDGE_T * frate; / * pentru lista individuală legată * / int str; / * Cost de margine * /); STRUCT NODE_T (EDGE_T * EDGE; / * Lista individuală legată de marginile * / NODE_T * VIA; / * în cazul în care nodul anterior este în cea mai scurtă cale * / Doză dublă; / * Distanța de la nodul de origine * / Numele de caractere; / * the, er , Nume * / INTHEAP_IDX; / * LINK LA POZIȚIA HEAP pentru actualizarea distanței * /); / *-- Gestionarea marginilor --- * / #ifdef big_example # define bloc_size (1024 * 32 - 1) #Else # define bloc_size 15 #Didif Edge_t * Edge_root \u003d 0, * e_next \u003d 0; / * Nu minte lucrurile de gestionare a memoriei, ele sunt pe lângă punctul. PREDEND E_NEXT \u003d Malloc (dimensiunea (EDGE_T)) * / VOLD Adaugă_EDGE (NODE_T * A, NODE_T * B, DOUBLY D) (dacă (E_Next \u003d\u003d Edge_root ) (Sizeof (EDGE_T) * (Block_Size + 1)); Edge_root.sibling \u003d E_Next; E_Next \u003d Edge_root + Block_Size;) --E_Next; e_next-\u003e l; e_next-\u003e sibling \u003d A-\u003e margine; A-\u003e margine \u003d e_next;) Void Free_eges () (pentru (EdgeRoot, Edge_root \u003d E_Next) (E_Next \u003d Edge_root.sibling; Free (Edge_root);)) / * Cheie de coadă prioritară --- * / Heap_t * heap; INTHEAP_LEN; VOID SET_DIST (NODE_T * ND, NODE_T * VIA DOUBLY D) (INT I, J; / * Știa deja o cale mai bună * / dacă (nd-\u003e via && d\u003e \u003d nd-\u003e dist) retur ; / * Găsiți intrarea heap existentă sau creați un nou * / nd-\u003e dis \u003d d; nd-\u003e via \u003d via; i \u003d nd-\u003e heap_idx; dacă (! I) i \u003d ++ heap_len; / * upheap * / pentru (; i\u003e 1 && nd-\u003e dist< heap->dist; i \u003d j) (heap [i] \u003d heap [j]) -\u003e heap_idx \u003d i; Halda [i] \u003d nd; nd-\u003e heap_idx \u003d i; ) NODE_T * POP_QUEUE () (NODE_T * ND, * TMP; INT I, J; Dacă (! heap_len) retur 0; / * Eliminați elementul de conducere, trageți elementul de coadă acolo și răsturnarea * / nd \u003d heap; tmp \u003d halda; pentru (i \u003d 1; eu< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dIST\u003e HAP-\u003e DIST) J ++; dacă (heap [j] -\u003e dist\u003e \u003d tmp-\u003e dist); (Heap [i] \u003d heap [j]) -\u003e heap_idx \u003d i; ) Halda [i] \u003d tmp; Tmp-\u003e heap_idx \u003d i; Retur nd; ) / * --- chestii Dijkstra; Nodurile inaccesibile nu vor intra niciodată în coadă --- * / vid cald_all (node_t * pornire) (node_t * plumb; margine_t * e; set_dist (începeți, porniți, 0); în timp ce ((plumb \u003d pop_queue ()) pentru ( E \u003d plumb-\u003e margine; e; e \u003d e-\u003e sibling) set_dist (E-\u003e ND, plumb, plumb-\u003e dis + E-\u003e len);) vid show_path (node_t * nd) (dacă (nd-\u003e VIA \u003d\u003d ND) Printf ("% s", Nd-\u003e Nume); altfel dacă (! nd-\u003e via) printf ("% s (nerecuperat)", nd-\u003e nume); altceva (show_path (nd-\u003e via); Printf ("-\u003e% s (% g)", nd-\u003e nume, nd-\u003e dister);)) int principal (void) (#fndef big_example int i; # define N_NODES ("F" - " un "+ 1) nod_t * noduri \u003d caloc (dimensiunea (NODE_T), N_NODES); pentru (i \u003d 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" \u003d\u003e $ EDGE); $ vecini [$ Edge] \u003d Array ("capăt" \u003d\u003e $ marginea, "cost" \u003d\u003e $ margine); ) $ verticale \u003d array_unique ($ nodici); foreach ($ nordices ca $ vertex) ($ distant [$ vertex] \u003d INF; $ anterior [$ vertex] \u003d null;) $ dist [$ source] \u003d 0; $ Q \u003d noduri $; în timp ce (numărul ($ q)\u003e 0) (// todo - găsiți o modalitate mai rapidă pentru a obține minimum $ min \u003d inf, foreach ($ Q ca vertex) (dacă ($ diste [$ vetex]< $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

    Din colecții importă Namedtuple, coada de la PPRINT Importă Pprint ca PP Inf \u003d float ("margine", "Start, End, cost") Graficul de clasă (): def __init __ (Sine, margini): Self .dges \u003d margini2 \u003d Sine. Vârfuri \u003d set (suma (pentru e în margini2),)) Def Dijkstra (Self, sursă, DER): Sursa de afirmație în Self.vertes Dist \u003d (Vertex: Inf pentru Vertex în Self.vertes) Precedent \u003d (Vertex: Nici unul Pentru Vertex în Self.vertectice) DIST \u003d 0 Q \u003d Self.vertes.copy () Vecinii \u003d (Vertex: set () pentru vârful în Self.Ventices) Pentru început, sfârșit, costul în sine. Marginile: (sfârșitul , Cost)) #pp (vecinii) în timp ce q: u \u003d min (q, cheie \u003d lambda vertex: dist) q.remove (u) dacă dish dis [u] \u003d\u003d inf sau u \u003d \u003d dest: pauză pentru v, cost La vecini [U]: Alt \u003d DIST [U] + Costul dacă 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"]

    Calea de pe linia punctată din imagine este mai scurtă decât pe solid. Și acum mai multe detalii despre exemplul rutelor marine:

    Dacă înotați cu un curs permanent, traiectoria deplasării navei pe suprafața Pământului va fi o curbă numită în matematică logaritmspirală.

    În navigare, se numește această linie complexă de curbură loccodromia., care tradus din limba greacă înseamnă "rularea oblică".

    Cu toate acestea, cea mai scurtă distanță dintre cele două puncte de pe glob este măsurată pe arcul unui cerc mare.

    Arcul unui cerc mare este obținut ca o urmă din intersecția suprafeței pământului cu un avion care trece prin centrul pământului luat de minge.

    În navigație, arcul unui cerc mare a fost numit orthodromia., care este tradusă înseamnă "alergare dreaptă". A doua caracteristică a ortodromiei este că traversează meridianele la diferite unghiuri (figura 29).

    Diferența dintre distanțele dintre cele două puncte de pe suprafața pământului în loccodromia și ortodroy este practică numai sub tranziții mari de ocean.

    În condiții normale, această diferență este neglijată și înotul face pe un an permanent, adică. Pe locodromia.

    Pentru ieșirea ecuației, luați locodiologia (figura 30, dar) două puncte DARși ÎN,distanța dintre care este elementară puțin. După ce ați cheltuit meridianele și paralele prin ele, obținem un triunghi sferic dreptunghiular elementar ABC.În acest unghi triunghi format din intersecția meridianului și paralel, drept și unghiul, P. N.Ab.egal cu cursul navei K. Kartit AC.reprezintă un segment al meridianului ARC și poate fi exprimat

    unde R. - Radiusul Pământului a acceptat pentru minge;

    Δφ este creșterea elementară a latitudinii (diferența latitudine).

    Cathe. Sf.reprezintă o tăietură de paralele cu arc

    unde r. - paralele cu raza;

    Δλ - Diferența elementară de longitudine.

    De la triunghi oo 1 c puteți găsi asta

    Apoi, în forma finală a formei Sf.acesta poate fi exprimat astfel:

    Luând un triunghi sferic elementar Abc.pentru plat, scrieți

    După abreviere R. iar înlocuirea creșterilor elementare de coordonate sunt infinit mici

    Integrați expresia rezultată în intervalul de la φ 1, λ 1 până la 2, λ 2 având în vedere valoarea TGK Permanent:

    În partea dreaptă avem un integral tabular. După înlocuirea valorii sale, obținem ecuația locodromului pe minge

    Analiza acestei ecuații vă permite să trageți următoarele concluziile:

    În timpul cursurilor 0 și 180 °, locodromia se transformă într-un arc mare de cerc - meridian;

    În timpul cursurilor 90 și 270 °, locodromia coincide cu paralel;

    Locodromul traversează fiecare paralel o singură dată, iar fiecare meridian este nenumărate ori. acestea. Spirală se apropie de pol, ea nu ajunge la ea.

    Înotând printr-un curs permanent, adică în Lokodromia, deși nu este cea mai scurtă distanță între două puncte de pe Pământ, prezintă în mod constant facilități considerabile.

    Cerințele pentru harta navigației marine pot fi formulate pe baza avantajului înotului în Lokodromia și a rezultatelor analizei ecuației sale după cum urmează.

    1. Loccodromia, traversând meridianele la un colț permanent, ar trebui să fie descrisă cu o linie dreaptă.

    2. Proiecția cartografică utilizată pentru a construi cărți ar trebui să fie la fel de echivalentă cu cursurile, discursurile și colțurile din acesta corespund importanței acestora.

    3. Meridiani și paralele, ca liniile de cursuri 0, 90, 180 ° și 270 °, trebuie să fie reciproc perpendiculare pe liniile drepte.

    Distanța cea mai scurtă dintre cele două puncte de pe suprafața pământului, preluată peste minge, este un arc mai mic de un cerc mare care trece prin aceste puncte. În plus față de cazul unei nave după meridian sau ecuator, ortodromia traversează meridianele în diferite unghiuri. Prin urmare, nava de lângă o astfel de curbă ar trebui să-și schimbe cursul tot timpul. Este aproape mai convenabil să urmeze cursul care constituie un unghi permanent cu meridiane și descris pe hartă în proiecția liniei directe Mercator - loccodromia. Cu toate acestea, la distanțe mari, diferența în lungimea ortodromiei și a loccodromiei atinge o cantitate semnificativă. Prin urmare, în astfel de cazuri, acestea calculează ortodromina și subliniate în punctele intermediare între care înotul în loccodromia.

    Proiecția cartografică care îndeplinește cerințele enumerate a fost propusă de cartograful olandez Gerard Kramer (Mercator) în 1569. În cinstea creatorului său, proiecția a fost numită mercator.

    Și cine vrea să învețe și mai multe informații interesante Citiți mai multe Articolul original este pe site Inforos Legătura cu un articol cu \u200b\u200bcare se face această copie -