图的遍历(DFS与BFS)
2017-02-21 19:28
190 查看
一、深度优先遍历(DFS)
基本思想:从图中某个顶点Vo出发,访问此顶点,然后依次从Vo的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和Vo有路径相通的顶点都被访问到。代码(递归用vector存)
<php> const int MAXN=1010; vector <int> g[MAXN];//存储边 bool visited [MAXN];//节点是否被访问 void dfs(int x) {visited[x]=true;//标记x被访问 for(int i=0;i<g[x].size();i++) if(!visited[i]) dfs(i);//遍历x的相邻结点,若没被访问则从这个结点开始深搜遍历 }
二、广度优先遍历(BFS)
从某个顶点Vo出发,并在访问此顶点之后依次访问Vo的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和Vo有路径相通的顶点都被访问到。代码(用队列)
<php> const int MAXN=1000+5; vector <int> g[MAXN];//存储边 queue<int> q; bool visited[MAXN];//是否被访问 for(int i=1;i<=MAXN;i++) g[i].clear(); while(!q.empty()) q.pop();//移除队列第一个元素 memset(visited,0,sizeof(visited)); void bfs() {visited[1]=1;//初始结点进入队列 q.push(1); while(!q.empty())//队列为空时结束遍历 {int t=q.front(); q.pop(); for(int i=0;i<g[t].size();i++)//寻找队头元素的相邻结点并弹出队头元素 if(!visited[i])//访问相邻结点并使之入队 {q.push(i); visited[i]=1; } } }
三、vector 容器
①头文件 #include②创建vector对象 vector vec;
③尾部插入数字 vec.push_back(a);
清空 vec.clear();
大小 vec.size();
④使用迭代器访问元素
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<< *it;
⑤在第i个元素前插入新元素a
vec.insert(vec.begin()+i,a);
删掉某个元素(从0开始删掉第i个)
vec.erase(v.begin()+i);
(删除一段)
vec.erase(v.begin()+i;v.begin()+j);
⑥用sort排序(升序)
#include
sort(vec.begin(),vec.end());
相关文章推荐
- 图的遍历:DFS BFS
- DFS,BFS,前序,中序,后序,层序遍历
- BFS、DFS、先序、中序、后序遍历的非递归算法(java)
- 图的遍历(dfs、bfs、最短路、最小生成树、拓扑排序)
- 图、图的遍历、DFS生成树、BFS生成树
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 1094. The Largest Generation (25)[dfs|bfs遍历]
- 邻接矩阵 遍历 DFS And BFS~~~
- 图的深度优先遍历DFS和广度优先遍历BFS
- 图的遍历(最小转机数)——dfs&&bfs
- 【算法——02】图的遍历——BFS广度优先搜索、DFS深度优先搜索
- 广度优先遍历-BFS、深度优先遍历-DFS
- 图论之图的遍历DFS与BFS
- Java数据结构----图--深度优先遍历BFS和广度优先遍历DFS
- 【二十七】图的遍历--DFS、BFS
- 用邻接表存储有向图并实现DFS(递归+非递归)BFS(非递归)两种遍历
- 图的遍历算法DFS和BFS(C++)
- 【图】BFS遍历、DFS遍历、Topology排序、判断二分性
- 深度遍历(DFS)与广度遍历(BFS) (C语言实现)
- 大话数据结构 code 第七章 04邻接表深度和广度遍历DFS_BFS