В этой статье мы изучим на c# реализацию алгоритма Флойда-Уоршолла для определения кратчайших путей во взвешенном графе с положительными или отрицательными весами ребер.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace FloydWarshallAlgorithm
{
class FloydWarshallAlgo
{
public const int cst = 9999;
private static void Print(int[,] distance, int verticesCount)
{
Console.WriteLine("Кратчайшее расстояния между каждой парой вершин:");
for (int i = 0; i < verticesCount; ++i)
{
for (int j = 0; j < verticesCount; ++j)
{
if (distance[i, j] == cst)
Console.Write("cst".PadLeft(7));
else
Console.Write(distance[i, j].ToString().PadLeft(7));
}
Console.WriteLine();
}
}
public static void FloydWarshall(int[,] graph, int verticesCount)
{
int[,] distance = new int[verticesCount, verticesCount];
for (int i = 0; i < verticesCount; ++i)
for (int j = 0; j < verticesCount; ++j)
distance[i, j] = graph[i, j];
for (int k = 0; k < verticesCount; ++k)
{
for (int i = 0; i < verticesCount; ++i)
{
for (int j = 0; j < verticesCount; ++j)
{
if (distance[i, k] + distance[k, j] < distance[i, j])
distance[i, j] = distance[i, k] + distance[k, j];
}
}
}
Print(distance, verticesCount);
}
static void Main(string[] args)
{
int[,] graph = {
{ 0, 6, cst, 11 },
{ cst, 0, 4, cst },
{ cst, cst, 0, 2 },
{ cst, cst, cst, 0 }
};
FloydWarshall(graph, 4);
Console.ReadKey();
}
}
}
Вывод:
Кратчайшее расстояние между каждой парой вершин:
0 6 10 11
cst 0 4 6
cst cst 0 2
cst cst cst 0
