PAT学习,关于图

2019年1月4日16:05:11
乙级基本已经刷完,在刷甲级的时候,我遇到到很多新的东西,另外数据结构的基础知识也不牢固,考虑到将要考试,便放弃系统学习数据结构后来的知识,在面对新的知识的时候在这里做记录;本文主要关于图;
1013 Battle Over Cities (25 分)
这个题涉及到了一个知识是,图的连通分量;这个地方简单的说一下,之前是没遇到这个概念的,图的连通分量大概意思就是一个图中可以分为几个无关联的部分(无关联就是这个部分与其他部分不连通,该题考虑的是无向图),那这个图就有几个连通分量;
而这个题,就是给出结点,每个路径相连结点,问去掉一个结点之后,需要最少几个路径使其成为连通图,也就是问去掉一个结点之后,我们得到的图有几个连通分量;
一个图成为连通图所需最少路径数,等于其连通分量数-1;
在这个时候,那么怎么计算一个图的连通分量呢;我查到的我看懂的方法是,它主要是对图进行遍历,DFS,对访问过的结点做有已访问标记,然后我们在遍历每个结点,看这个结点是否被访问过,如果没有被访问过,那我们要再做DFS,这中间加有count,每次加1,结束之后count的值就是连通分量的个数;
大概这样:
for(每个结点i)
if(i未被访问)
count++;DFS(i);//count初始为0
到这里,这个题就变成了摘除一个结点之后,整个图的连通分量数的求解了;如果让我来解决的话,我会想要将对被摘除的结点进行一个打断,那么它就变成一个孤立的点了;我觉得这样子很傻,可行性不高;然而柳神的思路是,假设它一开始就被访问过了,然后我们再进行连通分量的查找。
我看了DFS的原理
DFS:
void DFS(vertex v){
visit[v] = true;
for(v的每个邻接点w)
if(!visit[w])
DFS(w);
}
不明白,它这个已被访问的解决方案是如何做到的,那我看下她的代码;
2019年1月4日17:50:46
但事实是它好像就是这么运作的,这大概就是初学者的傻吧,个人理解,把DFS看作是一条蛇在图中爬行,这条蛇看到已经亮了灯(结点)之后,就不再继续前行,这种将灯亮起来的操作,我刚刚不太能理解。这可能是我对DFS的运作情况不懂所造成的吧。

猜你喜欢

转载自blog.csdn.net/qq_34701632/article/details/85782115