问题描述
给出一个城市的地图(用邻接矩阵表示),商店设在一点,使各个地方到商店距离之和最短。
输入
第一行为n(共有几个城市); N小于201
第二行至第n+1行为城市地图(用邻接矩阵表示);
样例输出
最短路径之和
样例输入
3
0 3 1
3 0 2
1 2 0
样例输出
3
算法讨论
图的中心问题,求到所有点距离最短,可以每次以一个顶点为源点,重复执行Dijkstra算法n 次,从里面找出最短的距离总和。时间复杂度为O(n³)。
const
maxn=200;
var
a:array[1..maxn,1..maxn] of longint;
l:array[1..maxn] of longint;
f:array[1..maxn] of 0..1;
i,j,k,n,min,min1,s,p:longint;
begin
readln(n);
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
min:=maxlongint;
for k:=1 to n do
begin
fillchar(f,sizeof(f),0);
s:=0;
for i:=1 to n do
l[i]:=a[k,i];
repeat
p:=0; min1:=maxlongint;
for i:=1 to n do
if (f[i]=0) and (l[i]<min1) and (l[i]<>0)
then begin
p:=i;
min1:=l[i]
end;
if p<>0
then begin
f[p]:=1;
for i:=1 to n do
if (f[i]=0) and (l[p]+a[p,i]<l[i])
then l[i]:=l[p]+a[p,i]
end;
until p=0;
for i:=1 to n do
if l[i]<>0
then inc(s,l[i]);
if s<min
then min:=s;
end;
write(min)
end.
Pixiv ID:57526556