lzm
who dare win.
posts - 14, comments - 29, trackbacks - 0, articles - 0
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2009年4月
>
日
一
二
三
四
五
六
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
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
(13)
Algorithm(10)
OJ(3)
随笔档案
(14)
2009年4月 (11)
2009年3月 (2)
2008年10月 (1)
收藏夹
(4)
POJ
SL(4)
ZOJ
最新随笔
1. poj 1094 Sorting It All Out
2. Floyd_Warshall算法
3. Kruskal算法
4. Prim算法
5. Critical Path 关键路径
6. Bellman_Ford算法 SPFA算法
7. Dijkstra算法
8. USP 无权最短路径算法
9. Topsort 拓扑排序
10. (正则表达式)是否匹配(字符串)
11. Quicksort 快速排序
12. poj 1024 Tester Program
13. poj 1022 Packing Unit 4D Cubes
14. 加减乘除24
搜索
积分与排名
积分 - 38570
排名 - 543
最新评论
1. re: Dijkstra算法
请问一下,这个路径可以输出成功吗?为什么我的差不多可输不出来呢?
prev[w] = v; 只加着一句就够了吗?
--毛
2. re: (正则表达式)是否匹配(字符串)[未登录]
呃……请问为什么我输入A*G.C和AGTGTC,结果是dismatch呢?
--xyz
3. re: Kruskal算法
这个程序是不是有个bug:
如果节点数量为1,边数量为0
则应该是有生成树的,但是kruskal函数返回结果为false吧
个人意见
--mwxjm
4. re: 加减乘除24
想问下~为什么tb1函数要swap交换后在执行后有swap
--65666
5. re: poj 1024 Tester Program[未登录]
灰常感谢LZ,看了你的第5条那个,让debug了3个小时的我一下就过了;
因为我的初始化原来是-1,所以酿成杯具啊。。
这bug。。汗。
--joy
阅读排行榜
1. Dijkstra算法(6184)
2. Kruskal算法(4530)
3. Prim算法(4338)
4. (正则表达式)是否匹配(字符串)(3879)
5. 加减乘除24(2390)
评论排行榜
1. 加减乘除24(7)
2. poj 1094 Sorting It All Out(5)
3. Quicksort 快速排序(4)
4. (正则表达式)是否匹配(字符串)(3)
5. Dijkstra算法(3)
USP 无权最短路径算法
Posted on 2009-04-09 10:44
lzmagic
阅读(2193)
评论(0)
编辑
收藏
引用
所属分类:
Algorithm
/**/
/*
*
* USP 无权最短路径算法(Unweighted Shortest Path Algorithm)
* 输入:(1)图g; // 有向图或者无向图
* (2)源点s。
* 输出:(1)源点s到各点的无权最短路径长dist(路径的边数最小);
* (2)源点s到各点的无权最短路径prev。
* 结构: 图g用邻接表表示,最短路径长dist用数组表示。
* 算法:广度优先搜索(BFS)
* 复杂度:O(|E|+|V|)~O(|E|)
*/
#include
<
iostream
>
#include
<
vector
>
#include
<
list
>
#include
<
queue
>
#include
<
iterator
>
#include
<
algorithm
>
#include
<
numeric
>
#include
<
functional
>
#include
<
climits
>
using
namespace
std;
int
n;
//
n : 顶点个数
vector
<
list
<
int
>
>
g;
//
g : 图(graph)(用邻接表(adjacent list)表示)
int
s;
//
s : 源点(source)
vector
<
int
>
dist;
//
dist : 源点s到各点之间的距离
vector
<
int
>
prev;
//
prev : 各点最短路径的前一顶点号
void
USP()
//
广度优先搜索(BFS)
{
queue
<
int
>
que;
dist.assign(n, INT_MAX);
//
初始化dist,
prev.resize(n);
//
初始化prev。
dist[s]
=
0
; que.push(s);
//
s到自身距离为0,s入队。
while
(
!
que.empty())
{
int
v
=
que.front(); que.pop();
//
v出队,
for
(list
<
int
>
::iterator it
=
g[v].begin(); it
!=
g[v].end();
++
it)
//
遍历v相邻点*it,
if
(dist[
*
it]
==
INT_MAX)
//
如果*it未访问,
{
dist[
*
it]
=
dist[v]
+
1
; prev[
*
it]
=
v;
//
调整点*it,
que.push(
*
it);
//
*it入队。
}
}
}
void
Print_SP(
int
v)
{
if
(v
!=
s) Print_SP(prev[v]);
cout
<<
v
<<
"
"
;
}
int
main()
{
n
=
7
;
g.assign(n, list
<
int
>
());
g[
0
].push_back(
1
); g[
0
].push_back(
3
);
g[
1
].push_back(
3
); g[
1
].push_back(
4
);
g[
2
].push_back(
0
); g[
2
].push_back(
5
);
g[
3
].push_back(
2
); g[
3
].push_back(
4
); g[
3
].push_back(
5
); g[
3
].push_back(
6
);
g[
4
].push_back(
6
);
g[
6
].push_back(
5
);
s
=
2
;
USP();
copy(dist.begin(), dist.end(), ostream_iterator
<
int
>
(cout,
"
"
)); cout
<<
endl;
for
(
int
i
=
0
; i
<
n;
++
i)
if
(dist[i]
!=
INT_MAX)
{
cout
<<
s
<<
"
->
"
<<
i
<<
"
:
"
;
Print_SP(i);
cout
<<
endl;
}
system(
"
pause
"
);
return
0
;
}
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Floyd_Warshall算法
Kruskal算法
Prim算法
Critical Path 关键路径
Bellman_Ford算法 SPFA算法
Dijkstra算法
USP 无权最短路径算法
Topsort 拓扑排序
(正则表达式)是否匹配(字符串)
Quicksort 快速排序
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © lzmagic