Задать вопрос

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

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

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

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

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


65e54fd4a2ab4494b2551e64b4f7c17e.png
  • Вопрос задан
  • 866 просмотров
Подписаться 3 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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) );
    }
}

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

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

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