yuanyuelang
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
编程之美
(rss)
编程珠玑
(rss)
文章分类
计算几何学
(rss)
数据结构(1)
(rss)
数论(4)
(rss)
图论(4)
(rss)
转载(1)
(rss)
文章档案
2010年4月 (1)
2009年9月 (9)
阅读排行榜
评论排行榜
常用链接
我的随笔
我的评论
我参与的随笔
统计
随笔 - 0
文章 - 10
评论 - 5
引用 - 0
最新评论
1. re: 数论(2)-------扩展欧几里得算法
定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
--s
2. re: 数论(2)-------扩展欧几里得算法
min=y-[y/a]y错了.
--CrazyForAC
3. re: 数论(2)-------扩展欧几里得算法
评论内容较长,点击标题查看
--晓楠
4. re: 数论(2)-------扩展欧几里得算法
顶
--ding
5. re: 不相交集合数据结构[未登录]
太简陋了一点吧
--a
每对顶点间的最短路径之Floyd-Warshall算法
Floyd-Warshall算法的基本思路是:
1.用D[v][w]记录每对顶点间的最短距离
2.对每一个图中的顶点,以其作为基点扫描每一对D[v][w],检验是否通过该基点可以使得这对顶点间的距离变小。
我们实际是很容易就可以写出这个算法的代码:
#define
N 100
void
Floyd(
int
dist[N][N],
int
n)
{
int
i,j,k;
for
(k
=
0
;k
<
n;k
++
)
for
(i
=
0
;i
<
n;i
++
)
for
(j
=
0
;j
<
n;j
++
)
if
(dist[i][k]
+
dist[k][j]
<
dist[i][j])
dist[i][j]
=
dist[i][k]
+
dist[k][j];
}
我们还面临一个保存路径的问题,如何来做呢?
#define
N 100
int
map[N][N];
void
Floyd(
int
dist[N][N],
int
path[N][N],
int
n)
{
int
i,j,k;
for
(i
=
0
;i
<
n;i
++
)
for
(j
=
0
;j
<
n;j
++
)
dist[i][j]
=
map[i][j],path[i][j]
=
0
;
for
(k
=
0
;k
<
n;k
++
)
for
(i
=
0
;i
<
n;i
++
)
for
(j
=
0
;j
<
n;j
++
)
if
(dist[i][k]
+
dist[k][j]
<
dist[i][j])
{
dist[i][j]
=
dist[i][k]
+
dist[k][j];
path[i][j]
=
k;
}
void
output(
int
i,
int
j)
{
if
(i
==
j)
return
;
if
(path[i][j]
==
0
) cout
<<
j
<<
"
"
;
else
{
output(i,path[i][j]);
output(path[i][j],j);
}
}
posted on 2009-09-23 11:35
原语饿狼
阅读(348)
评论(0)
编辑
收藏
引用
所属分类:
图论
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
每对顶点间的最短路径之Floyd-Warshall算法
单源最短路径之Dijkstra算法
最小生成树之Prim算法
最小生成树之Kruskal算法
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © 原语饿狼