Матрица смежности на PHP, не могу разобраться как реализовать?

Добрый день.
Стоит задача, расчета матрицы смежности. Т.е. мне надо получить расстояние между POI (точками на карте)
Не понимаю как построить матрицу.

Есть ли примеры данного алгоритма не в математической формуле а в виде реализации?

upd.
Уточню, если описание не понятно, извиняюсь.

данные в виде массива координат
["37.7880555555556,-122.399166666667", "40.7252222222222,-73.9993888888889"]


65e54fd4a2ab4494b2551e64b4f7c17e.png
  • Вопрос задан
  • 856 просмотров
Решения вопроса 1
sayber
@sayber Куратор тега PHP
Да, я программирую на PHP и еще асинхронно!
# $citys массив городов, у которых есть poi. 
# poi являются массивом в виде строки.
# calcRange
public function createdMatrix ($citys)
    {
        # Пробегаем грода
        for ($i = 0; count($citys) > $i; $i++) {
            $poi = $citys[$i]->poi;
            $count_poi = count($poi);
            for ($r = 0; $count_poi > $r; $r++) {
                $data[$i][$r] = []; 
                for ($v = 0; $count_poi > $v; $v++) {
                    $sqrt = $this->calcRange($poi[$r]['coordinates'], $poi[$v]['coordinates']);
                    $data[$i][$r][] = $sqrt;
                }
                $data[$i][$r]['max'] = $this->maxHorizontSum($data[$i][$r]);

            }
            $data[$i]['max'][] = max($data[$i]);

        }
        return $data;
    }

# Получаем разницу между точками
 public function calcRange($cdr1, $cdr2)
    {
        $cdr1 = explode(',', $cdr1);
        $cdr2 = explode(',', $cdr2);
        $sqrt = sqrt(pow(( $cdr1[0] - $cdr2[0] ), 2) + pow(( $cdr1[1] - $cdr2[1] ), 2));
        return round($sqrt, 6);
    }


В итоге вы получите примерно следующие. Если конечно в HTML будите выводить.
11 поле, сложение горизонтали

285fe0eab5d1499388b743ed5846c69f.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Alexander1705
В данном примере задаётся по три числа: индексы двух вершин и вес ребра между ними.

int N;
cin >> N;

int** am = new int*[N];
for(int i = 0; i != N; ++i)
    am[i] = new int[N];

int i, j, l;
while(cin) {
    cin >> i >> j >> l;
    am[i][j] = l;
}


upd.
Окей, если вершины - это точки, а рёбра расстояния между ними, делаем следующим образом:
// N - количество точек
// points - список точек
// points[i].x - x-координата i-той точки
// points[i].y - y-координата i-той точки

int** am = new int*[N];
for(int i = 0; i != N; ++i)
    am[i] = new int[N];

for(int i = 0; i != N; ++i) {
    for(int j = 0; j != N; ++j) {
        am[i][j] = sqrt( sqr(points[i].x - points[j].x) + sqr(points[i].y - points[j].y) );
    }
}

Можете также оптимизировать, высчитав не всё матрицу, а только её половину (треугольник). А вторую половину заполнить зеркально главной диагонали.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы