Программа по нахождению кратчайшего пути (не могу прилепить нормальный вывод) - C#
Формулировка задачи:
Здравствуйте. Проблема заключается в следующем - программе не хватает вывода пути. Я никак не могу придумать, как сделать вывод. Подскажите как можно это реализовать?
PS консольное приложение
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static int i, j, n, p, xn, xk;
static bool[] flag;
static uint[,] c;
static uint[] l;
static int min(int n)
{
//поиск кратчайшего пути
int i, result = 0;
for (i = 0; i < n; i++)
if (!(flag[i])) result = i;
for (i = 0; i < n; i++)
if ((l[result] > l[i]) && (!flag[i])) result = i;
return result;
}
static uint minim(uint x, uint y)
{
if (x < y) return x;
return y;
}
static void Main(string[] args)
{
string s = "";
bool z = false;
string path = "";
Console.Write("Напишите число точек: ");
//ввод количества вершин графа
for (; ; )
{
s = Console.ReadLine();
for (int q = 0; q < s.Length; q++)
if (s[q] == '1' || s[q] == '2' || s[q] == '3' || s[q] == '4' || s[q] == '5' || s[q] == '6' || s[q] == '7' || s[q] == '8' || s[q] == '9' || s[q] == '0')
{
z = true;
}
else
{
z = false;
break;
}
if (z == true)
{ n = Convert.ToInt32(s); break; }
else
Console.Write("Неверный ввод данных. Повторите, пожалуйста: ");
}
l = new uint[n];
c = new uint[n, n];
flag = new bool[n];
s = "";
//ввод длин рёбер
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) c[i, j] = 0;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; j++)
{
Console.Write(" задайте длину ребра x");
Console.Write(i + 1);
Console.Write(" до x");
Console.Write(j + 1);
Console.Write(": ");
c[i, j] = Convert.ToUInt32(Console.ReadLine());
if (c[i, j] < 0) c[i, j] = 0;
}
Console.Write(" ");
for (i = 0; i < n; i++)
{
Console.Write(" X");
Console.Write(i + 1);
}
Console.Write("\n");
Console.Write("\n");
//печать матрицы смежности
for (i = 0; i < n; i++)
{
Console.Write("X{0:D}", i + 1);
for (j = 0; j < n; j++)
{
Console.Write("{0,6:D}", c[i, j]);
c[j, i] = c[i, j];
}
Console.Write("\n\n");
}
//избавление от нулей
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (c[i, j] == 0) c[i, j] = 65535;
//ввод начальной точки пути
Console.Write(" задайте начальную точку: ");
xn = Convert.ToInt32(Console.ReadLine());
path = Convert.ToString(xn + " ");
//ввод конечной точки пути
Console.Write(" задайте конечную точку: ");
xk = Convert.ToInt32(Console.ReadLine());
int rem = xk;
xk--;
xn--;
//проверка на совпадение точек
if (xn == xk)
{
Console.WriteLine("Начальная и конечные точки совпадают");
Console.ReadLine();
return;
}
for (i = 0; i < n; i++)
{
flag[i] = false;
l[i] = 65535;
}
//установка начальной точки
l[xn] = 0;
flag[xn] = true;
p = xn;
s = Convert.ToString(xn + 1);
//расчёт путей и выбор кратчайшего пути
do
{
for (i = 0; i < n; i++)
if ((c[p, i] != 65535) && (!flag[i]) && (i != p))
{
if (l[i] > l[p] + c[p, i])
{
s = Convert.ToString(i + 1);
}
l[i] = minim(l[i], l[p] + c[p, i]);
}
p = min(n);
//запись пути
path += (p+1) + " ";
flag[p] = true;
} while (p != xk);
//вывод полученных данных
if (l[p] < 65535)
{
Console.Write("Put: ");
Console.Write(path);
Console.Write("\n");
Console.Write("Dlina puti: ");
Console.Write(l[p]);
Console.Write("\n");
}
else
Console.Write("Путь не существует!");
Console.Write("\n");
Console.ReadLine();
}
}
}Решение задачи: «Программа по нахождению кратчайшего пути (не могу прилепить нормальный вывод)»
textual
Листинг программы
Console.Write(path);