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
搜索
积分与排名
积分 - 38486
排名 - 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算法(6181)
2. Kruskal算法(4521)
3. Prim算法(4334)
4. (正则表达式)是否匹配(字符串)(3866)
5. 加减乘除24(2387)
评论排行榜
1. 加减乘除24(7)
2. poj 1094 Sorting It All Out(5)
3. Quicksort 快速排序(4)
4. (正则表达式)是否匹配(字符串)(3)
5. Dijkstra算法(3)
Topsort 拓扑排序
Posted on 2009-04-06 09:40
lzmagic
阅读(2048)
评论(2)
编辑
收藏
引用
所属分类:
Algorithm
/**/
/*
*
* TOPSORT(简单版) 拓扑排序(Topological Sort)
* 输入:有向图g
* 输出:是否存在拓扑排序,如果存在,获取拓扑排序序列seq
* 结构:图g用邻接矩阵表示
* 算法:广度优先搜索(BFS)
* 复杂度:O(|V|^2)
*/
#include
<
iostream
>
#include
<
vector
>
#include
<
queue
>
#include
<
iterator
>
#include
<
algorithm
>
#include
<
numeric
>
#include
<
climits
>
using
namespace
std;
int
n;
//
n :顶点个数
vector
<
vector
<
int
>
>
g;
//
g :图(graph)(用邻接矩阵(adjacent matrix)表示)
vector
<
int
>
seq;
//
seq :拓扑序列(sequence)
bool
TopSort()
{
vector
<
int
>
inc(n,
0
);
for
(
int
i
=
0
; i
<
n;
++
i)
for
(
int
j
=
0
; j
<
n;
++
j)
if
(g[i][j]
<
INT_MAX)
++
inc[j];
//
计算每个顶点的入度,
queue
<
int
>
que;
for
(
int
j
=
0
; j
<
n;
++
j)
if
(inc[j]
==
0
) que.push(j);
//
如果顶点的入度为0,入队。
int
seqc
=
0
;
seq.resize(n);
while
(
!
que.empty())
//
如果队列que非空,
{
int
v
=
que.front(); que.pop();
seq[seqc
++
]
=
v;
//
顶点v出队,放入seq中,
for
(
int
w
=
0
; w
<
n;
++
w)
//
遍历所有v指向的顶点w,
if
(g[v][w]
<
INT_MAX)
if
(
--
inc[w]
==
0
) que.push(w);
//
调整w的入度,如果w的入度为0,入队。
}
return
seqc
==
n;
//
如果seq已处理顶点数为n,存在拓扑排序,否则存在回路。
}
int
main()
{
n
=
7
;
g.assign(n, vector
<
int
>
(n, INT_MAX));
g[
0
][
1
]
=
1
, g[
0
][
2
]
=
1
, g[
0
][
3
]
=
1
;
g[
1
][
3
]
=
1
, g[
1
][
4
]
=
1
;
g[
2
][
5
]
=
1
;
g[
3
][
2
]
=
1
, g[
3
][
5
]
=
1
, g[
3
][
6
]
=
1
;
g[
4
][
3
]
=
1
, g[
4
][
6
]
=
1
;
g[
6
][
5
]
=
1
;
if
(TopSort())
{
copy(seq.begin(), seq.end(), ostream_iterator
<
int
>
(cout,
"
"
));
cout
<<
endl;
}
else
{
cout
<<
"
circles exist
"
<<
endl;
}
system(
"
pause
"
);
return
0
;
}
Feedback
#
re: [图论算法] TOPSORT 拓扑排序
回复
更多评论
2009-04-07 13:38 by
aiver
你的代码输出是 0 1 4 2 6 3 5, 2先于3输出了,有问题。
#
re: [图论算法] TOPSORT 拓扑排序
回复
更多评论
2009-04-07 14:37 by
lzmagic
@aiver
啊哈,有个小bug,现在已经修改好了,谢谢指出错误~
答案是:0 1 4 3 2 6 5
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Floyd_Warshall算法
Kruskal算法
Prim算法
Critical Path 关键路径
Bellman_Ford算法 SPFA算法
Dijkstra算法
USP 无权最短路径算法
Topsort 拓扑排序
(正则表达式)是否匹配(字符串)
Quicksort 快速排序
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © lzmagic