设图G=(V,E)是一个有向图,对于每对结点(U,V),找出从U到V的最短路径。
【Floyd算法思想】
利用一个三重循环产生一个存储每个结点最短距离的矩阵.
【Floyd算法实例】
现有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表城市之间的距离。求每个城市的最短距离
【输入】 第一行两个数v,e,分别代表城市数和边数 以下e行,每行为两个顶点和它们之间的边权。
【输出】 所有可能连接的城市的最短距离。
|
【输入样例】
6 10
1 2 10
1 5 19
1 6 21
2 3 5
2 4 6
2 6 11
3 4 6
4 5 18
4 6 14
5 6 33
【输出样例】
1 2 10
1 3 15 1 4 16 1 5 19 1 6 21 2 3 5 2 4 6 2 5 24 2 6 11 3 4 6 3 5 24 3 6 16 4 5 18 4 6 14 5 6 32 |
![]() |
program floyd_example;
const
maxn=10;
var
n,s,t,i,j:integer;
dist:array[1..maxn,1..maxn] of real;
prev:array[1..maxn,1..maxn] of 0..maxn;
procedure init;
var
m,i,u,v:integer;
begin
assign(input,'floyd.in');
reset(input);
assign(output,'floyd.out');
rewrite(output);
readln(n,m);
fillchar(prev,sizeof(prev),0);
for u:=1 to n do
for v:=1 to n do
dist[u,v]:=1e10;
for i:=1 to m do
begin
readln(u,v,dist[u,v]);
dist[v,u]:=dist[u,v];
prev[u,v]:=u;
prev[v,u]:=v;
end;
end;{init}
procedure floyd;
var
i,j,k:integer;
begin
for k:=1 to n do
for i:=1 to n do
for j:=1 to n do
if (dist[i,k]+dist[k,j]<dist[i,j])
then begin
dist[i,j]:=dist[i,k]+dist[k,j];
prev[i,j]:=prev[k,j];
end;
end;{floyd}
procedure print(i,j:integer);
begin
if i=j
then write(i)
else if prev[i,j]=0
then write('No Solution!')
else begin
print(i,prev[i,j]);
write('->',j);
end;
end;{print}
begin
init;
floyd;
for i:=1 to n do
for j:=i+1 to n do
begin
write(i,' ',j,' ');
write(dist[i,j]:0:0,' ');
print(i,j);
writeln;
end;
close(input);
close(output);
end.

浙公网安备 33010602011771号