Алгоритм Дейкстры, перевод с 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;