- 注册时间
- 2008-7-21
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 11556
- 在线时间
- 小时
|
楼主 |
发表于 2009-2-25 12:41:34
|
显示全部楼层
设图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.
复制代码 |
|