diff --git a/Task02/ParallelAlgoFloyd.cs b/Task02/ParallelAlgoFloyd.cs new file mode 100644 index 0000000..0b40924 --- /dev/null +++ b/Task02/ParallelAlgoFloyd.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading.Tasks; + +namespace Task02 +{ + public class ParallelAlgoFloyd + { + static int[,] dist; + + static void parallelProc(int n, int k, int i) + { + for (int j = 0; j < n; j++) + { + if (j != k) + { + if (dist[i, j] > dist[i, k] + dist[k, j]) + dist[i, j] = dist[i, k] + dist[k, j]; + } + } + } + + public static int[,] Execute() + { + int n = GeneralResources.n; + dist = new int[n, n]; + Task[] tasks = new Task[n - 1]; + Array.Copy(GeneralResources.graphMatrix, dist, n * n); + + for (int k = 0; k < n; k++) + { + for (int i = 0; i < n; i++) + { + if (i != k) + { + int newK = k; + int newI = i; + // передаём newK и newI для того, чтобы избежать замыкания + tasks[i < k ? i : i - 1] = Task.Run(() => parallelProc(n, newK, newI)); + } + } + // ждём выполнения всех задач для того, чтобы случайно не получилось так, что + // задача с большим k не обогнала задачу с меньшим k (и чтобы нам всегда хватило + // ровно n - 1 задачи) + Task.WaitAll(tasks); + } + + return dist; + } + } +}