社区
数据结构与算法
帖子详情
如何判断一个图是否连通?
liuding731
2007-07-12 02:43:25
rtrt
...全文
9070
40
打赏
收藏
如何判断一个图是否连通?
rtrt
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
40 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tt346446408
2010-08-25
打赏
举报
回复
从图中某点出发如果能一次性的遍历完图中的各个顶点,则该图为连通图,否则为非连通图
FancyMouse
2010-08-13
打赏
举报
回复
>我实现的是20万顶点,80万的数量。不到1分钟。
好慢……
bigc2000
2010-08-13
打赏
举报
回复
别瞎话了
去看看Tarjan算法和GABOW算法,都是一次O(V+E),我实现的是20万顶点,80万的数量。不到1分钟。
wjjayo
2010-08-11
打赏
举报
回复
厉害,我也正被这个问题所困扰
zhu_nn
2010-08-11
打赏
举报
回复
用深搜广搜吧
Justmeh
2010-08-11
打赏
举报
回复
for each vertex v
v.visited = false;
q.enqueue(v0); // 任先一个起始顶点入队列
count = 0;
while(!q.isempty())
{
v <-- q.dequeue();
v.visited = true;
count++;
for each vertex w adjacent to v
{
if(!w.visited)
q.enueue(w);
}
}
if(count==总的点数n)
连通
else
非连通
复杂度为O(|v|+|E|)(顶点数+边数)
augustinlouis
2010-05-19
打赏
举报
回复
无向图很简单,用dfs一次搞定,有向图就很复杂了,常见的方法有Tarjan和Gabow,他们可以找出一个有向图的所有强连通分量,得到一个核心DAG(刚发现此贴似乎是07年的帖子。。。。。)
aipeng
2010-05-17
打赏
举报
回复
如果在MATLAB里那又该如何判断呢?代码怎么写?谢谢!
heelp
2010-05-17
打赏
举报
回复
DFS 并查集(判断最后是否只有一个集合)都可以吧
flying_sb
2010-05-17
打赏
举报
回复
便利一遍应该就可以了吧
AAA20090987
2010-05-17
打赏
举报
回复
直接用深搜或广搜找一遍,全部找到了就是连通的,否则就是不连通的。
超级大笨狼
2009-10-10
打赏
举报
回复
我计算过围棋的死活问题,递归向4个方向,每前进一步,标记一下,复杂度应该是O(n)级别的,n是连通的范围,只要有和空地相连就没死,就跳出了,因为跳出的概率很大,所以速度还是很快的。
euroman
2009-10-09
打赏
举报
回复
[Quote=引用 25 楼 chounuo 的回复:]
楼上的算法可以,但说明有点问题:复杂度不应该是O(N),因为remove these nodes nodes from Q0 的复杂度一般不是1,这涉及一个查找问题.
[/Quote]
是的,谢谢,上面算法的时间复杂度是O(N*N)
如果只需要校验这个图是否连通图,可以进行简化,把最外层的循环去掉,也把remove these nodes nodes from Q0,从途中任意一个点出发,然后在循环里面对点的数目进行计算。
当跳出循环后,如果计数器中的数目小于途中点集的数目,那么就说明此图不是一个连通图,而且算法的复杂度就可以达到O(N)啦。
之前给的伪码可以用来计算图中有多少个连通图(明显题目不需要进行具体的数目,只需要判断是否连通)。
希望这个是完美的答案
showjim
2009-10-08
打赏
举报
回复
[Quote=引用 1 楼 fire_woods 的回复:]
从任意点出发
在剩余的点中,找到所有相邻点
循环,直到没有点可以加入为止.如果有剩余的点就是不连通的.否则就是连通的.
[/Quote]
配合hash,效率应该很高的。
showjim
2009-10-08
打赏
举报
回复
[Quote=引用 1 楼 fire_woods 的回复:]
从任意点出发
在剩余的点中,找到所有相邻点
循环,直到没有点可以加入为止.如果有剩余的点就是不连通的.否则就是连通的.
[/Quote]
配合hash,效率应该很高的。
hua_zhixing_
2009-10-08
打赏
举报
回复
用深度或广度优先搜索,若得到的元素与集合的所有元素相等,则是连通图,否则不是。
andy0409
2009-10-08
打赏
举报
回复
都是厉害角色.
latitude
2009-10-08
打赏
举报
回复
楼上的算法可以,但说明有点问题:复杂度不应该是O(N),因为remove these nodes nodes from Q0 的复杂度一般不是1,这涉及一个查找问题.
latitude
2009-10-08
打赏
举报
回复
楼上的算法可以,但说明有点问题:复杂度不应该是O(N),因为remove these nodes nodes from Q0 的复杂度一般不是1,这涉及一个查找问题.
booksoon
2009-10-08
打赏
举报
回复
从任意点出发
在剩余的点中,找到所有相邻点
循环,直到没有点可以加入为止.如果有剩余的点就是不连通的.否则就是连通的.
加载更多回复(20)
判断
一个
图
是否
连通
判断
一个
图
是否
连通
从
图
中的任意
一个
顶点开始进行深度优先遍历搜索,如
图
中所有点都可以遍历到,即只有
一个
连通
分量,则说明这个
图
连通
图
的定义及基本操作请参考: 邻接表表示
图
(有向、无向
图
)及广度、深度遍历). bool visited[MaxVertexNum]; //访问标记数组 //从顶点v出发,采用递归,深度遍历
图
G void DFS(ALGraph G, int v) { ...
sdut 2604 Thrall’s Dream
判断
一个
图
是否
单侧
连通
题意: 给你
一个
有向
图
,问这个有向
图
中任何一对结点间,至少有
一个
结点到另
一个
结点是可达的。 实际上就是
判断
一个
图
是否
单侧
连通
。做法很简单,先强
连通
分解,然后在新建的
图
中找一条 最长的链,如果这条链包含所有点,那原
图
就是单侧联通的,否则就不是。 那如何找最长链呢,很简单因为新建的
图
是DAG,所以最长链的长度=最长路。而对DAG求最短路 最长路都是可以用dp高效求解的。时间复杂度o(n+m)
c语言
判断
一个
图
是否
全
连通
_数据结构 -
图
图
概念
图
(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常称为 顶点(vertex) ,而点到点之间的连线通常称之为 边或者弧(edge) 。通常记为G=(V,E)。权重:当边带有数字标签时,可以将这些数字称为 权重 ,并且说这个
图
是
一个
加权
图
路径:
一个
顶点到另
一个
顶点的边的序列
连通
的
图
:
图
中的每
一个
顶点到其他的每
一个
顶点都有一条路径完全的
图
:从每
一个
...
判断
一个
图
是否
是
连通
判断
一个
图
是否
是
连通
总的来说,可以用DFS(O(v^2))和BFS(O(v+e))的思想都能实现,只要从
一个
点出发,然后
判断
是否
能遍历完所有的点。还有就是Tarjan算法和gabow算法和kosarujo,这个没研究过,据说很好用。 实现办法一:用Warshall算法,时间复杂度为O(v^3),时间复杂度较大。 实现办法二:拓扑排序(多用于有向
图
)。 实现办法三:用BF
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章