Skip to content

Commit

Permalink
Create ParallelAlgoFloyd.cs
Browse files Browse the repository at this point in the history
  • Loading branch information
SergeyKuz1001 authored Nov 1, 2019
1 parent e8ad5fe commit f3b19ec
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions Task02/ParallelAlgoFloyd.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}

0 comments on commit f3b19ec

Please sign in to comment.