понедельник, 25 июля 2011 г.

Алгоритм связности

cls

function matrixdost($matrix){
    #алгоритм уоршела, для вычисления матрицы достижимости
    for ($k = 0; $k -lt $matrix.Length; $k++){
        for ($i = 0; $i -lt $matrix.Length; $i++){
            for ($j = 0; $j -lt $matrix.Length; $j++){
                $matrix[$i][$j] = $matrix[$i][$j] -bor ($matrix[$i][$k] -band $matrix[$k][$j])
            }
        }
    }
}

function matrixprint($matrix){
    for($i = 0; $i -lt $matrix.Length; $i++){
        $str = [System.String]::Join(",", $matrix[$i])
        Write-Host $str
    }
}

function matrixsv($matrix){
    $v = @()
    $a = @()
    [object[]]$all = @()
    for($i = 0; $i -lt $matrix.Length; $i++){
        $v += 1
    }
  
    #компоненты связанности
    for($i = 0; $i -lt $v.Length; $i++){
        $a = @()
        if ($v[$i] -eq 0){
            continue
        }
        for($j = 0; $j -lt $v.Length; $j++){
            if ($matrix[$i][$j] -eq 1){
                $a += $j
                $v[$j] = 0
            }
        }
        if ($a.Length -ne 0){
            $all += [object]$a
            $all += "-"
        }
    }
  
    for ($i=0; $i -lt $v.Length; $i++){
        if ($v[$i] -eq 1){
            $all += $i
            $all += "-"
        }
    }
  
    return $all
}

$m = @(
    @(0, 0, 0, 0, 0, 1, 0, 1),
    @(0, 0, 0, 0, 1, 0, 0, 0),
    @(0, 0, 0, 0, 0, 1, 0, 1),
    @(0, 0, 0, 0, 1, 0, 0, 0),
    @(0, 1, 0, 1, 0, 0, 0, 0),
    @(1, 0, 1, 0, 0, 0, 0, 0),
    @(0, 0, 0, 0, 0, 0, 0, 0),
    @(1, 0, 1, 0, 0, 0, 0, 0)
)

matrixprint $m
matrixdost $m

"-------------"
matrixprint $m

$svcomp = matrixsv $m
$str = [System.String]::Join(",", $svcomp)

Write-Host $str

Комментариев нет:

Отправить комментарий