远风工作室
C++博客
|
首页
|
发新随笔
|
发新文章
|
联系
|
聚合
|
管理
随笔:92 文章:0 评论:72 引用:0
判断图连通&求割点的算法
之所以把判断图连通的算法以及求图中割点的算法放在一起写,是因为这两者之间有一定的关系。注意:
只有连通图中才可能有割点,不连通的图是没有割点的
。总的来说,这两类算法都离不开并查集结构和BFS先深搜索,具体如下:
1.判断图连通的算法
第一种方法基于BFS,首先利用邻接表(链表形式或者数组形式都可以)存储图的信息,然后取标号值最小的顶点u作为根节点进行先深搜索,最终搜索到的节点将形成一棵树,判断图是否连通,只要判断是否所有节点都在树上即可。
代码如下:
//
graph[][]存储图信息,num[]存储每个顶点的邻接点数目
memset(flag,
0
,
sizeof
(flag));
DFS(
1
);
for
(i
=
1
; i
<=
nodeNum; i
++
)
{
if
(flag[i]
==
false
)
{
printf(
"
不连通\n
"
);
}
}
//
DFS算法
void
DFS(
int
x)
{
int
i;
flag[x]
=
true
;
for
(i
=
0
; i
<
num[x]; i
++
)
{
if
(flag[graph[x][i]]
==
false
)
{
DFS(graph[x][i]);
}
}
}
然而这种算法存在弊端,就是需要存储所有的边信息,当边信息足够多时,存储数组graph[][]、num[]和flag[]的开销是很大的。第二种基于并查集的方法则解决了这个弊端,关于并查集的内容具体可见:
http://www.cppblog.com/amazon/archive/2009/08/15/93457.html
。对所有的边信息进行并查集处理后,如果该图是连通图,那么所有节点的根节点指针都指向同一个点。
代码如下:
a
=
Find(record[
0
]);
for
(j
=
1
; j
<
num_record; j
++
)
{
if
(a
!=
Find(record[j]))
{
printf(
"
The door cannot be opened.\n
"
);
break
;
}
}
2.求割点的算法
首先必须保证,
所求的图是连通图,不连通的图没有割点
。
该算法依然基于BFS,按照标号值大小依次将图中的顶点隐去,对剩下的所有节点进行先深搜索,根据搜索子树的数目即可知道隐去的节点是否割点(数目为1,非割点;数目为2以上,割点),并可根据子树的数目知道删除该割点后连通子图的数目。
代码如下:
jump
=
false
;
for
(i
=
1
; i
<=
nodeNum; i
++
)
{
subnetNum
=
0
;
HowMuch(i, subnetNum);
if
(subnetNum
!=
1
)
{
printf(
"
%d是割点,删除后有%d个连通子图\n
"
, i, subnetNum);
jump
=
true
;
}
}
if
(jump
==
false
)
{
printf(
"
不是割点\n
"
);
}
//
DFS算法
void
DFS(
int
x)
{
int
i;
flag[x]
=
true
;
for
(i
=
0
; i
<
num[x]; i
++
)
{
if
(flag[graph[x][i]]
==
false
)
{
DFS(graph[x][i]);
}
}
}
//
判断是否割点
void
HowMuch(
int
x,
int
&
subnetNum)
{
int
i;
memset(flag,
0
,
sizeof
(flag));
flag[x]
=
true
;
for
(i
=
1
; i
<=
nodeNum; i
++
)
{
if
(flag[i]
==
false
)
{
subnetNum
++
;
DFS(i);
}
}
}
发表于 2009-08-17 19:24
远风
阅读(2855)
评论(0)
编辑
收藏
引用
所属分类:
数据结构 / 算法
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
数的整除特征【转载】
判断图连通&求割点的算法
并查集学习小结
判断回文素数的方法
判断素数的算法
Dijkstra算法
AVL树总结
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2011年11月
>
日
一
二
三
四
五
六
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
10
留言簿
(3)
给我留言
查看公开留言
查看私人留言
随笔分类
(93)
ACM(5)
(rss)
C/C++基础(20)
(rss)
Linux编程(16)
(rss)
MFC(7)
(rss)
MySQL(2)
(rss)
OPNET仿真(11)
(rss)
PHP(13)
(rss)
Python(3)
(rss)
STL(4)
(rss)
Web技术(2)
(rss)
Windows管理(3)
(rss)
数据结构 / 算法(7)
(rss)
收藏夹
(2)
C/C++基础(1)
(rss)
数据结构 / 算法(1)
(rss)
搜索
积分与排名
积分 - 328560
排名 - 73
最新评论
1. re: makefile和make规则
可以评论么
--冯智浩
2. re: PHP调用外部程序的方法
大的as打算阿达的
--硕大的
3. re: LIB和DLL的区别与使用
太赞,收藏一下,谢谢
--mymimi1988
4. re: LIB和DLL的区别与使用
好文,好内容;
--wsdxyz
5. re: LIB和DLL的区别与使用
写的非常详细,感谢。
--Forward
6. re: LIB和DLL的区别与使用
非常好,说得很详细,也很明白,学习了!
--xihuwuyu
7. re: LIB和DLL的区别与使用
感觉很好,对于才接触dll的我来说很够用。。
--Chosan
8. re: VC中ListCtrl经验总结【转载】[未登录]
总结的很好啊,转了
--king
9. re: LIB和DLL的区别与使用
就我自己没看太懂吗
--AzzStyle
10. re: LIB和DLL的区别与使用
通俗易懂,呵
--我的
阅读排行榜
1. LIB和DLL的区别与使用(76424)
2. 虚拟机VMware tools安装【转载】(36562)
3. Linux串口编程(24845)
4. tar命令的C参数(18852)
5. 判断素数的算法(11403)
6. VC中ListCtrl经验总结【转载】(11285)
7. PHP调用外部程序的方法(11069)
8. makefile和make规则(9185)
9. C++进阶必读书籍【转载】(8413)
10. insert时出现主键冲突的处理方法【转载】(8214)