Chuyển ma trận trọng số (adjacency matrix) sang danh sách kề (adjacency list) là một thao tác phổ biến khi làm việc với đồ thị.
Cho ma trận trọng số như sau:
$matrix = [
// A B C D
[ 0, 1, 4, 0], // A
[ 0, 0, 2, 5], // B
[ 0, 0, 0, 1], // C
[ 0, 0, 0, 0] // D
];
Chúng ta sẽ chuyển thành:
$graph = [
'A' => ['B' => 1, 'C' => 4],
'B' => ['C' => 2, 'D' => 5],
'C' => ['D' => 1],
'D' => []
];
function matrixToAdjList(array $matrix, array $nodes): array {
$n = count($matrix);
$adjList = [];
for ($i = 0; $i < $n; $i++) {
$fromNode = $nodes[$i];
$adjList[$fromNode] = [];
for ($j = 0; $j < $n; $j++) {
$weight = $matrix[$i][$j];
if ($weight > 0) {
$toNode = $nodes[$j];
$adjList[$fromNode][$toNode] = $weight;
}
}
}
return $adjList;
}
$matrix = [
[0, 1, 4, 0],
[0, 0, 2, 5],
[0, 0, 0, 1],
[0, 0, 0, 0]
];
$nodes = ['A', 'B', 'C', 'D'];
$graph = matrixToAdjList($matrix, $nodes);
print_r($graph);
Array
(
[A] => Array
(
[B] => 1
[C] => 4
)
[B] => Array
(
[C] => 2
[D] => 5
)
[C] => Array
(
[D] => 1
)
[D] => Array
(
)
)
0
nghĩa là không có cạnh giữa hai đỉnh.