查找某一结点的邻居:

   virtual int firstNbr(int i) { return nextNbr(i, n); } //首个邻接顶点
virtual int nextNbr(int i, int j) //相对于顶点j的下一邻接顶点
{ while ((-1 < j) && (!exists(i, --j))); return j; } //逆向线性试探(改用邻接表可提高效率)

对于图中的全部顶点,对每个连通区域进行BFS:

template <typename Tv, typename Te> //广度优先搜索BFS算法(全图)
void Graph<Tv, Te>::bfs(int s) { //assert: 0 <= s < n
reset(); int clock = 0; int v = s; //初始化
do //逐一检查全部顶点
if (UNDISCOVERED == status(v)) //一旦遇到尚未发现的顶点
BFS(v, clock); //即从该顶点出发启动一次BFS
while (s != (v = (++v % n))); //按序号检查,故不漏不重
} template <typename Tv, typename Te> //广度优先搜索BFS算法(单个连通域)
void Graph<Tv, Te>::BFS(int v, int& clock) { //assert: 0 <= v < n
Queue<int> Q; //引入辅助队列
status(v) = DISCOVERED; Q.enqueue(v); //初始化起点
while (!Q.empty()) { //在Q变空之前,不断
int v = Q.dequeue(); dTime(v) = ++clock; //取出队首顶点v
for (int u = firstNbr(v); -1 < u; u = nextNbr(v, u)) //枚举v的全部邻居u
if (UNDISCOVERED == status(u)) { //若u尚未被发现。则
status(u) = DISCOVERED; Q.enqueue(u); //发现该顶点
status(v, u) = TREE; parent(u) = v; //引入树边拓展支撑树
} else { //若u已被发现,或者甚至已訪问完成,则
status(v, u) = CROSS; //将(v, u)归类于跨边
}
status(v) = VISITED; //至此。当前顶点訪问完成
}
}

最新文章

  1. CruiseControl.NET配置文件(生产环境版本,与SVN结合自动部署)
  2. php中的字符串常用函数(一) strpos() 子字符首次出现的位置
  3. iOS 沙盒(sandbox)机制和文件操作
  4. GitHub的使用(下)—— 如何下载一个已存在的 Repository
  5. JUC之Atomic系列12大类实例讲解和原理分解
  6. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧
  7. CentOS 7下的软件安装方法及策略
  8. ZOJ1025-最长下降子序列
  9. 经历:asp.net oracle 部署问题以及解决方法
  10. MyEclipse2014web工程项目直接复制不能访问报错处理方案
  11. java递归的应用和实例
  12. ireport报表学习
  13. redis深入了解
  14. 使用fetch调用node.js的Resuful服务
  15. Synchronize,Lock, ReentrantLock,ReentrantReadWriteLock
  16. wordpress中安装插件需要ftp服务
  17. k8s cronjob设置作业失败后退出不重复执行
  18. 48- java Arrays.sort和collections.sort()再次总结
  19. python re 正則表達式
  20. redis安装,修改配置文件,多实例部署 redis-server

热门文章

  1. linux批量匹配移动文件的方法
  2. bable
  3. eclipse中 tomcat首页server Locations变灰无法编辑
  4. EPPlus(SQL导成Excel)
  5. LVS Mode&amp;Method
  6. MYSQL常用的Show命令笔记
  7. 洛谷 [P1552] 派遣
  8. JS读取/创建本地文件及目录文件夹的方法
  9. android开发过程遇到的一些错误
  10. DOS头结构