算法导论 第22章 深度优先遍历
来源:互联网 发布:百度彩票数据接口 编辑:程序博客网 时间:2024/04/30 07:40
深度优先遍历的作用主要是对边,点的分类,如拓扑排序,找强连通分量等应用。
深度优先搜索的策略是只要有可能就尽量深入。也就是说每发现一个新的点就立马对其搜索,直到与该点所连接的所有点都被搜索完全,则返回了,返回该点的前驱。
由于深度优先搜索一般都是被其他算法所用,所以它要提供有效的信息,每个点保存一个d值和f值,d值是刚发现的时间,f值为结束对该点邻接点扫描的时间。 比如一个孤立点,发现时间为 p,则结束时间为p+1, 另外还保存一种颜色,白色为还未被发现,灰色为还未对该点搜索完,黑色该点已经被搜索完了。
#include<iostream>#include<fstream>#include<queue> using namespace std; class node { public: node():adjvex(0),nextvex(NULL){} int adjvex; node *nextvex; };class vex{public: char color; int predecessor; int d; //发现时间 int f; //完成时间};typedef node * adjnode; class Graph{ public: int n;//顶点个数 adjnode *Adj; vex * vexs; };void CreateGraph(Graph &g){ ifstream infile("graph22-6.txt"); cin.rdbuf(infile.rdbuf()); if(g.Adj==NULL)cout<<1<<endl; cout<<"请输入顶点数"<<endl; int n,x; cin>>n; g.Adj=new adjnode[n+1];// 0号不用 g.vexs=new vex[n+1]; g.n=n;cout<<"依次输入与每个顶点相邻的顶点号,以0为结束"<<endl;for(int i=1;i!=n+1;++i){ g.Adj[i]=new node; adjnode ne=g.Adj[i]; int ex=0; while(true){ cin>>x; if(x==0) break; else if(ex!=0){ ne->nextvex=new node; ne=ne->nextvex; } ++ex; ne->adjvex=x; }//while}}void printGraph(Graph g){ for(int i=1;i!=g.n+1;++i){ adjnode p=g.Adj[i]; while(p!=NULL){ cout<<p->adjvex<<" "; p=p->nextvex; } cout<<endl; }}int time=0; //全局变量 初始化为0void Dfs_visit(Graph &g,int u) //对某个白色的点进行深度搜索{ time++; //从上个点到这个点 时间+1 g.vexs[u].d=time; //发现时间 g.vexs[u].color='G'; //变为灰色,表示还未完成对点u的深度搜索 for(adjnode p=g.Adj[u];p!=NULL;p = p->nextvex) //对u点连接的点进行单个深度搜索 { int tem=p->adjvex; if(g.vexs[tem].color=='W'){ //发现还未被发现的点 g.vexs[tem].predecessor=u; Dfs_visit(g,tem); //递归调用 }}g.vexs[u].color='B'; //完成对u点的搜索 用黑色表示++time; //时间加1 从搜索点返回到ug.vexs[u].f=time; //完成时间赋值}void DepthFisrtSreach(Graph g) //深度优先搜索, O(V+E ) 。 尽可能的深入{ for(int i=1;i!=g.n+1;++i){ //初始化 所以点都白色,,还未被发现 g.vexs[i].color='W'; g.vexs[i].predecessor=i; } for(int i=1;i!=g.n+1;++i){ //对每个还未发现的点调用Dfs_visit if(g.vexs[i].color=='W'){ Dfs_visit(g,i); } }cout<<" 前驱 "<<"d值"<<" f值"<<endl;for(int i=1;i!=g.n+1;++i){ cout<<"结点"<<i<<": "<<g.vexs[i].predecessor <<" "<<g.vexs[i].d<<" "<<g.vexs[i].f <<endl; }} int main() { Graph G; CreateGraph( G); printGraph(G);DepthFisrtSreach(G); return 0;}
0 0
- 算法导论 第22章 深度优先遍历
- 算法导论第22章--深度优先算法,图的遍历
- 《算法导论》笔记 第22章 22.3 深度优先搜索
- 算法导论-第22章-基本的图算法:强连通分量(深度优先遍历基础上)C++实现
- 算法导论 第22章 图算法 22.3 深度优先搜索
- 算法导论-第22章-基本的图算法-22.3 深度优先搜索(DFS)
- 算法导论 第22章 图的基本算法(二) 深度优先搜索
- 【算法导论】二叉树的深度优先遍历
- 【算法导论】图的深度优先搜索遍历(DFS)
- 【算法导论】有向图的深度优先搜索遍历
- 算法导论 第22章, 广度优先搜索算法
- 《算法导论》笔记 第22章 22.2 广度优先搜索
- 算法导论 第23章 广度优先搜索 深度优先搜索 拓扑排序 强连通分量 C++实现
- 算法导论-第22章-基本的图算法-22.3 深度优先搜索-22.3-7-使用栈来代替递归实现DFS
- 深度优先和广度优先遍历算法
- 图--深度优先搜索 算法导论p331
- 算法导论-----图(深度优先搜索)
- 图的深度优先搜索----算法导论
- 第十二周项目二-分离正整数中的各位数
- 在Xcode中真机调试
- VPN
- CPC23-4 K.喵喵的神·数
- hdu 5106 组合数预处理
- 算法导论 第22章 深度优先遍历
- 第五章 用到的准备数据
- python问题笔记
- 自动轮播的ViewPage(开源项目)
- qt学习3——vs版qt出现的问题
- Zookeeper源码编译为Eclipse工程(win7下Ant编译)
- 关于ActionBar Tab与ListFragment的结合
- ios8来了,屏幕更大,准备好使用 iOS Auto Layout了吗?
- EasyConnect