Алгоритм Дейкстры, перевод с Pascal - C#
Формулировка задачи:
есть программа на языке Pascal, реализующий алгоритм Дейкстры, которую нужно переделать под С#
Половину передалал, но затрял на тому, что переменная "w" не присвоенно значеннию.
помогите исправить ошибку, и, если не трудно доделать ее.Буду благодарен за помощь))
вот код на Pascale:
Мой код на C#:
Program Dijkstra; Uses Crt; Label 1,2,3; Var n,i,j,m,a_0,a_n,sum,k,min,ind,w,v_:Integer; S,D,P,V:Array[1..10]of Integer; C:Array[1..10,1..10]of Integer; SIM:Array[1..10,1..20] Of Char; prom:Char; simbol:String; cifra:Integer; Function v_s(ind:Integer):Boolean; Var i : Integer; Begin v_s := False; For i:=1 To n Do If (s[i]=ind) Then v_s:= True; End; Begin ClrScr; Write('Введите количество a/п : '); Readln (n); Write('Введите количество авиалиний : '); Readln(m); Writeln(''); Write('V={'); For i:=1 To n Do Begin V[i]:=i; If (i<>n) Then Write(V[i],',') Else Write(V[i],'}'); End; sum:=0; C[1,2] := 10; C[1,4] := 30; C[1,5] := 100; C[2,3] := 50; C[3,1] := 70; C[3,5] := 10; C[4,3] := 20; C[5,4] := 60; Writeln(''); For i:=1 To n Do For j:=1 To n Do Begin Write('Введите номер а\п отправления : '); Readln(a_0); Write(''Введите номер а\п назначения : '); Readln(a_n); Write('Введите время полёта по авиалинии : '); Readln(C[a_0,a_n]);} If (C[i,j] <> 0) Then sum:=sum+C[i,j]; writeln; End; For i:=1 To n Do Begin If (Round(n/2)=i) Then Write ('C=') Else Write(' '); For j:=1 To n Do Begin If (C[i,j]=0) Then Begin C[i,j]:=sum; Write(' ~',' '); End Else Write(C[i,j],' '); End; Writeln(' '); End; S[1]:=1; For i:=1 To n Do V[i]:=V[i+1]; For i:=2 To n Do Begin P[i]:=1; D[i]:=C[1,i]; End; For k:=1 To (n-1) Do Begin min:=sum; For i:=2 To n Do If ((D[i]<=min)And(Not(v_s(i)))) Then Begin min:=D[i]; w:=i; End; For i:=1 To n Do If (S[i]=0) Then Begin S[i]:=w; Goto 1; End; 1: For i:=1 To n Do If (V[i]=w) Then Begin For j:=i To n Do V[j]:=V[j+1]; Goto 2; End; 2: i:=1; v_:=V[i]; While (v_<>0) Do Begin If (D[v_] > (D[w]+C[w,v_])) Then Begin D[v_]:=D[w]+C[w,v_]; P[v_]:=w; End; i:=i+1; v_:=V[i]; End; End; writeln; Write ('D={'); For i:=2 To n Do If (i<>n) Then Write(D[i],',') Else Write (D[i],'}'); writeln; Write('P={'); For i:=2 To n Do If (i<>n) Then Write (P[i],',') Else Write (P[i],'}'); For i:=2 To n Do Begin j:=1; Str(i,simbol); SIM[i,j]:=simbol[1]; 3:If (j=1) Then Begin Str(P[i],simbol); prom:=simbol[1]; End Else Begin Val(prom,cifra,cifra); Str(P[cifra],simbol); prom:=simbol[1]; End; j:=j+1; SIM[i,j]:='>'; j:=j+1; SIM[i,j]:='-'; j:=j+1; SIM[i,j]:=prom; If (prom<>'1') Then Goto 3; End; Writeln(' '); For i:=2 to n Do Begin Writeln(''); For j:=20 downto 1 Do Write(SIM[i,j]); Write(' = ',D[i]); End; readln; End. {Dijkstra}
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Metod_Dijkstra { class Program { static void Main(string[] args) { int n, i, j, m, a_0, a_n, sum, k, min, ind, w, v_; int[] V = new int[10]; int[] S=new int[10]; int[] D=new int[10]; int[] P=new int[10]; int[,] C = new int[10, 10]; char[,] SIM = new char[10, 20]; char prom; string simbol; int cifra; Console.Write("Введите количество а/п : "); n = int.Parse(Console.ReadLine()); Console.Write("Введите количество авиалиний : "); m = int.Parse(Console.ReadLine()); Console.Write("V={"); for (i = 1; i <= n; i++) { V[i] = i; if (i != n) { Console.Write(V[i]); Console.Write(","); } else { Console.Write(V[i]); Console.WriteLine("}"); } } sum = 0; C[1, 2] = 10; C[1, 3] = 30; C[1, 4] = 100; C[2, 1] = 10; C[2, 4] = 80; C[2, 5] = 50; C[3, 4] = 40; C[3, 6] = 10; C[4, 6] = 60; C[5, 3] = 70; C[6, 5] = 20; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { Console.Write("Введите номер аП отправления : "); a_0 = int.Parse(Console.ReadLine()); Console.Write("Введите номер ап назначения : "); a_n = int.Parse(Console.ReadLine()); Console.Write("Введите время полета по авиалинии: "); C[a_0, a_n] = int.Parse(Console.ReadLine()); if (C[i, j] != 0) { sum = sum + C[i, j]; Console.WriteLine(); } } } for (i = 1; i <= n; i++) { if (n / 2 == i) Console.Write("C="); else Console.Write(" "); for (j = 1; j <= n; j++) { if (C[i, j] == 0) { C[i, j] = sum; Console.Write("~"); Console.Write(" "); } else { Console.Write(C[i, j]); Console.Write(" "); } } Console.Write(" "); } S[1] = 1; for (i = 1; i <= n; i++) V[i] = V[i + 1]; for (i = 2; i <= n; i++) { P[i] = 1; D[i] = C[1, i]; } for (k = 1; k <= n - 1; k++) { min = sum; for (i = 2; i <= n; i++) { if (D[i] <= min) { min = D[i]; w = i; } } for (i = 1; i <= n; i++) if (S[i] == 0) { S[i] = w;//ошибка "переменной w не присвоенно значеннию"; goto one; } } one: for (i = 1; i <= n; i++) { if (V[i] == w) { for (j = 1; j <= n; j++) { V[i] = V[j + 1]; goto two; } } } two: i = 1; v_ = V[i]; } } } }
Решение задачи: «Алгоритм Дейкстры, перевод с Pascal»
textual
Листинг программы
Function v_s(ind:Integer):Boolean; Var i : Integer; Begin v_s := False; For i:=1 To n Do If (s[i]=ind) Then v_s:= True; End;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д