Найти ошибку в алгоритме обхода графа - C#
Формулировка задачи:
Всё работает нормально, но почему то он Выводит не правильные значения...
Вот код:
Сопротивление цепи где то не обновляется.. или что то такое... Очень рассчитываю на вашу помощь
Ход работы программы и сам граф ниже...
using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public static int i, j, k, kol;
public struct uzel
{
public int nom;
public int ki;
public int kj;
};
public static uzel n = new uzel();
public static int[] d = new int[12];
static void vkl(Stack vst, uzel n)
{
vst.Push(n);
}
static void iskl(Stack vst)
{
if (vst == null) Console.WriteLine("Стек пуст !");
else n = (uzel)vst.Pop();
}
public static void Main()
{
Stack vstek = new Stack();
string buf;
int beg, en, x, i1, i2;
uzel y1 = new uzel();
bool[] nov = new bool[12];
int[,] p = new int[11, 11];
int[] m = new int[12];
int[,] a = new int[11, 11]
{{0,10,20,1000,1000,1000,1000,1000,1000,1000,1000},
{10,0,1000,30,1000,1000,1000,1000,1000,1000,1000},
{20,1000,0,10,1000,1000,10,1000,1000,1000,1000},
{1000,10,10,0,20,1000,1000,1000,1000,1000,1000},
{1000,1000,1000,20,0,1000,1000,1000,20,1000,1000},
{1000,1000,1000,1000,1000,0,30,20,1000,1000,1000},
{1000,1000,10,1000,1000,30,0,10,10,30,1000},
{1000,1000,1000,1000,1000,20,10,0,1000,1000,1000},
{1000,1000,1000,1000,20,1000,10,1000,0,20,30},
{1000,1000,1000,1000,1000,1000,30,1000,20,0,1000},
{1000,1000,1000,1000,1000,1000,1000,1000,30,1000,0},};
string[] sum = new string[10];
for (i = 0; i < 11; i++)
{
p[i, 0] = i; k = 1;
for (j = 0; j < 11; j++)
if ((a[i, j] != 1000) && (a[i, j] != 0))
{
p[i, k] = j;
k++;
}
p[i, k] = 1000;
}
for (i = 0; i < 11; i++)
{
k = 0;
while (p[i, k] != 1000)
{
Console.Write(" {0}", p[i, k]);
k++;
}
Console.WriteLine();
}
Console.Write("Введите номер начального узла графа? ");
buf = Console.ReadLine();
beg = Convert.ToInt32(buf);
Console.Write("Введите номер конечного узла графа? ");
buf = Console.ReadLine();
en = Convert.ToInt32(buf);
for (i = 0; i < 12; i++)
{
nov[i] = true;
m[i] = 0;
}
int k5 = 0;
int[] s = new int[20];
int s1 = 0;
int[] s5 = new int[10];
nov[11] = false;
x = 1; //Номер очередного маршрута
m[1] = beg; i1 = 2;
y1.nom = beg; //Определяем поле nom узла y1
y1.ki = beg; // Запоминаем номер списка смеж. вершин
y1.kj = 0; // Запоминаем номер текущей позиции в списке
vkl(vstek, y1);
kol = 1;
nov[beg] = false;
nov[en] = false;
i = beg; j = 0;
while (kol != 0)
{
do
{
j++;
int f = 0;
if (p[i, j] == en)
{
k5 = 0;
Console.Write(" путь - {0} -", x); x++;
for (i2 = 1; i2 < i1; i2++)
{
Console.Write(" {0} ", m[i2]);
s[i2 - 1] = m[i2];
k5++;
f = i2;
}
k5++;
s[f] = en;
for (int c = 1; c < k5 - 1; c++)
{
s1 += a[s[c], s[c + 1]];
}
s1 += a[s[0], s[1]];
if ((s[0] != s[k5 - 2]) && (s[1] != en)) { s1 += a[s[k5 - 2], en]; }
Console.Write(" {0}", en);
Console.WriteLine(" Последовательное сопротивление:" + s1);
s1 = 0;
for (int c = 0; c < 20; c++)
{
s[c] = 0;
}
}
}
while ((p[i, j] != 1000) && (!nov[p[i, j]]));
if (p[i, j] != 1000)
if (nov[p[i, j]])
{
y1.ki = i;
y1.kj = j;
i = p[i, j];
y1.nom = i;
vkl(vstek, y1);
j = 0;
kol++;
nov[i] = false;
m[i1] = i;
i1++;
};
if (p[i, j] == 1000)
{
kol--;
if (kol != 0)
{
iskl(vstek);
i = n.ki;
j = n.kj;
i1--;
m[i1] = 0;
nov[n.nom] = true;
}
};
}
Console.WriteLine();
Console.WriteLine("Для продолжения нажмите клавишу Enter");
Console.ReadLine();
}
}
}Решение задачи: «Найти ошибку в алгоритме обхода графа»
textual
Листинг программы
using System;
using System.Collections;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public static int i, j, k, kol;
public struct uzel
{
public int nom;
public int ki;
public int kj;
};
public static uzel n = new uzel();
public static int[] d = new int[12];
static void vkl(Stack vst, uzel n)
{
vst.Push(n);
}
static void iskl(Stack vst)
{
if (vst == null) Console.WriteLine("Стек пуст !");
else n = (uzel)vst.Pop();
}
public static void Main()
{
Stack vstek = new Stack();
string buf;
int beg, en, x, i1, i2;
uzel y1 = new uzel();
bool[] nov = new bool[12];
int[,] p = new int[11, 11];
int[] m = new int[12];
int[,] a = new int[11, 11]
{{0,10,20,1000,1000,1000,1000,1000,1000,1000,1000},
{10,0,1000,30,1000,1000,1000,1000,1000,1000,1000},
{20,1000,0,10,1000,1000,10,1000,1000,1000,1000},
{1000,10,10,0,20,1000,1000,1000,1000,1000,1000},
{1000,1000,1000,20,0,1000,1000,1000,20,1000,1000},
{1000,1000,1000,1000,1000,0,30,20,1000,1000,1000},
{1000,1000,10,1000,1000,30,0,10,10,30,1000},
{1000,1000,1000,1000,1000,20,10,0,1000,1000,1000},
{1000,1000,1000,1000,20,1000,10,1000,0,20,30},
{1000,1000,1000,1000,1000,1000,30,1000,20,0,1000},
{1000,1000,1000,1000,1000,1000,1000,1000,30,1000,0},};
string[] sum = new string[10];
for (i = 0; i < 11; i++)
{
p[i, 0] = i; k = 1;
for (j = 0; j < 11; j++)
if ((a[i, j] != 1000) && (a[i, j] != 0))
{
p[i, k] = j;
k++;
}
p[i, k] = 1000;
}
for (i = 0; i < 11; i++)
{
k = 0;
while (p[i, k] != 1000)
{
Console.Write(" {0}", p[i, k]);
k++;
}
Console.WriteLine();
}
Console.Write("Введите номер начального узла графа? ");
buf = Console.ReadLine();
beg = Convert.ToInt32(buf);
Console.Write("Введите номер конечного узла графа? ");
buf = Console.ReadLine();
en = Convert.ToInt32(buf);
for (i = 0; i < 12; i++)
{
nov[i] = true;
m[i] = 0;
}
int k5 = 0;
int[] s = new int[20];
int s1 = 0;
int[] s5 = new int[10];
nov[11] = false;
x = 1; //Номер очередного маршрута
m[1] = beg; i1 = 2;
y1.nom = beg; //Определяем поле nom узла y1
y1.ki = beg; // Запоминаем номер списка смеж. вершин
y1.kj = 0; // Запоминаем номер текущей позиции в списке
vkl(vstek, y1);
kol = 1;
nov[beg] = false;
nov[en] = false;
i = beg; j = 0;
while (kol != 0)
{
do
{
j++;
int f = 0;
if (p[i, j] == en)
{
k5 = 0;
Console.Write(" путь - {0} -", x); x++;
for (i2 = 1; i2 < i1; i2++)
{
Console.Write(" {0} ", m[i2]);
s[i2 - 1] = m[i2];
k5++;
f = i2;
}
k5++;
s[f] = en;
for (int c = 1; c < k5 - 1; c++)
{
s1 += a[s[c], s[c + 1]];
}
s1 += a[s[0], s[1]];
//if ((s[0] != s[k5 - 2]) && (s[1] != en)) { s1 += a[s[k5 - 2], en]; }
Console.Write(" {0}", en);
Console.WriteLine(" Последовательное сопротивление:" + s1);
s1 = 0;
for (int c = 0; c < 20; c++)
{
s[c] = 0;
}
}
}
while ((p[i, j] != 1000) && (!nov[p[i, j]]));
if (p[i, j] != 1000)
if (nov[p[i, j]])
{
y1.ki = i;
y1.kj = j;
i = p[i, j];
y1.nom = i;
vkl(vstek, y1);
j = 0;
kol++;
nov[i] = false;
m[i1] = i;
i1++;
};
if (p[i, j] == 1000)
{
kol--;
if (kol != 0)
{
iskl(vstek);
i = n.ki;
j = n.kj;
i1--;
m[i1] = 0;
nov[n.nom] = true;
}
};
}
Console.WriteLine();
Console.WriteLine("Для продолжения нажмите клавишу Enter");
Console.ReadLine();
}
}
}