- •Оптимальное размещение обслуживающих центров задачи поиска медиан
- •Утверждение 1.
- •Задачи поиска центров
- •Для неориентированной дуги центр находится в вершине, абсолютный центр – в любой точке дуги.
- •1. Алгоритмом Флойда найдем матрицу d расстояний между всеми парами вершин:
- •Утверждение 2.
- •Обобщения
- •Задача о p-центре
Утверждение 2.
Расстояние между внутренними точками дуги i-j и максимально удаленной от них вершиной равно
(MaxI + MaxJ + A[i, j])2.
Доказательство.
Заметим, что вершины k1 и k2 являются наиболее удаленными от дуги i-j (если бы существовала вершина k3 более удаленная, чем k1 и k2, то она была бы более удаленной или от i, или от j).
Пусть x – абсолютный центр дуги i-j – внутренняя точка дуги (вершины при поиске абсолютного центра рассматриваются отдельно). Тогда вершины k1 и k2 равноудалены от точки x, иначе точку x можно было сдвинуть в точку x* с меньшим расстоянием от наиболее удаленной вершины.
Таким образом, D[k1, x]=D[k2, x], если точка x – абсолютный центр дуги i-j. Сумма D[k1, x]+D[k2, x] в точности равна MaxI + MaxJ + A[i, j] и расстояние между дугой и наиболее удаленной вершиной равно D[k1, x]=D[k2, x]=
(MaxI + MaxJ + A[i, j])2, ч.т.д.
Алгоритм. {Абсолютный центр}
Данные: неориентированный граф G=<V, E>, неотрицательная матрица весов A[u,v], u,vV.
Результаты: абсолютный центр графа G, находящийся на расстоянии x от вершины i дуги i-j.
1 begin
2 floyd; {формирование матрицы расстояний D алгоритмом Флойда}
minmax:=inf; r:=0; {minmax – расстояние от абсолютного центра r до самой удаленной вершины }
{поиск центра в вершинах}
for i:=1 to n do
begin
Max:=D[i,1]; {Max – расстояние до наиболее удаленной от i вершины}
for j:=2 to n do
if D[i,j]> Max then Max:=D[i,j];
if minmax> Max then
begin
r:=i;
minmax:= Max;
end;
end;
writeln(’Центр находится в вершине ’,r,’ расстояние до самой удаленной вершины ’,minmax:5:2);
{поиск абсолютного центра на дугах}
for i:=1 to n-1 do
for j:=i+1 to n do
if A[i,j]<inf then {дуга i-j существует}
begin
MaxI:=0; {расстояние от i до самой удаленной вершины}
MaxJ:=0; {расстояние от j до самой удаленной вершины}
for k:=1 to n do
if (k<>i) and (k<>j) then
begin
if D[i,k]<inf then di:=D[i,k];
if D[j,k]<inf then dj:=D[i,k];
if di>dj then{k ближе к j}
begin
if dj>MaxJ then {k наиболее удаленная от j вершина}
MaxJ:=dj;
end
else {k ближе к i}
begin
if di>MaxI then {k наиболее удаленная от i вершина}
MaxI:=di;
end;
end; {перебрали все вершины для дуги i-j}
{dist – расстояние от дуги i-j до наиболее удаленной вершины}
dist:=(MaxI+A[i,j]+MaxJ)/2;
x:=dist-MaxI; {расстояние абсолютного центра от вершины i}
if (dist<minmax)and
(x>0)and(A[i,j]-x>0){условие внутренней точки}
then
begin
minmax:=dist;
writeln(’Абсолютный центр для дуги ’, i,’-’,j,’ находиться на расстоянии ’,x:5:2,’ от вершины ’);
writeln(’Расстояние от наиболее удаленной вершины ’, minmax:5:2);
end;
end;
end.