15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法
算法分析和具体步骤解说直接写在代码注释上了
TvT 没时间了等下还要去洗衣服 就先不赘述了
有不明白的欢迎留言交流!(估计是没人看的了)
直接上代码:
#include<stdio.h>
#include<queue>
#include<iostream>
using namespace std;
typedef struct{
int Vex[];//顶点表
int Edge[][];
int vexnum,arcnum;
}MGraph;
bool visited[];
void printGraph(MGraph &G)
{
cout<<"Show the Graph."<<endl;
cout<<"----------------------------"<<endl;
for(int i=;i<;i++){
for(int j=;j<;j++)
{
cout<<" "<<G.Edge[i][j]<<" ";
}
cout<<endl;
}
cout<<"----------------------------"<<endl;
cout<<"There are "<<G.arcnum<<" arcs in the Graph!"<<endl;
cout<<"Arcs are listed as follow:"<<endl;
for(int i=;i<;i++){
for(int j=;j<;j++)
{
if(G.Edge[i][j]==)
cout<<i<<"-->"<<j<<endl;
}
}
}
int initGraph(MGraph &G)
{
G.vexnum=;
G.arcnum=;
for(int i=;i<;i++)
for(int j=;j<;j++)
{
G.Edge[i][j]=;
}
cout<<"input the relation of a pair of dots (A,B) to build a graph.(0<A,B<10)"<<endl;
cout<<"End up with data(0,0)"<<endl;
int a,b;
cin>>a>>b;
while(a!=&&b!=){
G.arcnum++;
G.Edge[a][b]=;
cin>>a>>b;
}
cout<<"successful."<<endl;
printGraph(G);
}
bool isNeibour(MGraph &G,int a,int b)
{
if(G.Edge[a][b]==)
return true;
else return false;
}
int firstNeighbor(MGraph &G,int v)
{
int pos=-;
for(int i=;i<G.vexnum;i++)
{
if((G.Edge[v][i]==))
{pos=i;break;}
}
return pos;
}
int nextNeighbor(MGraph &G,int v,int w)
{
int pos=-;
for(int i=w+;i<G.vexnum;i++)
{
if((G.Edge[v][i]==))
{
pos=i;break;
}
}
return pos;
}
void visit(int v)
{
visited[v]=true;
cout<<v<<" ";
}
queue<int> Q;
void bfs(MGraph G,int v)
{
visit(v);
Q.push(v);
int now;
while(!Q.empty())
{
now=Q.front();
Q.pop();
for(int w=firstNeighbor(G,now);w>=;w=nextNeighbor(G,now,w))
{
if(!visited[w])
{
visit(w);
Q.push(now);
}
}
}
}
void BFS(MGraph &G)
{
for(int i=;i<G.vexnum;i++)
visited[i]=false;
for(int i=;i<G.vexnum;i++)
{
if(!visited[i])
bfs(G,i);
}
}
/*DFS 深度优先搜索*/
/*类似于树的先序遍历
其搜索策略:尽可能【深】地搜索一个图。
遍历思想:
从一个起始顶点v出发,访问与v邻接但未被访问的任一顶点a→继续访问a顶点的下一未被访问的顶点b→……→无法再向下访问时依次退回到最近被访问的顶点
直到所有顶点都被访问为止
*/
void dfs(MGraph &G,int v)
{
visit(v);
int w;
for(w=firstNeighbor(G,v);w>=;w=nextNeighbor(G,v,w))
{
if(!visited[w])
{
dfs(G,w);
}
}
}
void DFS(MGraph &G)
{
for(int i=;i<G.vexnum;i++)
{
visited[i]=false;
}
for(int i=;i<G.vexnum;i++)
{
if(!visited[i])
dfs(G,i);
}
}
int main()
{
MGraph P;
initGraph(P);
cout<<"test of BFS:"<<endl;
BFS(P);
cout<<endl;
cout<<"test of DFS:"<<endl;
DFS(P);
return ;
}
附一张运行截图
15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法的更多相关文章
- 图的全部实现(邻接矩阵 邻接表 BFS DFS 最小生成树 最短路径等)
1 /** 2 * C: Dijkstra算法获取最短路径(邻接矩阵) 3 * 6 */ 7 8 #include <stdio.h> 9 #include <stdlib.h> ...
- 数据结构实验之图论二:图的深度遍历(SDUT 2107)(简单DFS)
题解:图的深度遍历就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点. #include <bits/stdc++.h> using n ...
- 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
#include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> ...
- 基于邻接矩阵的深度优先搜索(DFS)
题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2107&cid=1186 #include<stdio.h> #incl ...
- 邻接矩阵实现Dijkstra算法以及BFS与DFS算法
//============================================================================ // Name : MatrixUDG.c ...
- PTA 邻接矩阵存储图的深度优先遍历
6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)( ...
- 算法学习 - 图的广度优先遍历(BFS) (C++)
广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不 ...
- C语言实现邻接矩阵创建无向图&图的深度优先遍历
/* '邻接矩阵' 实现无向图的创建.深度优先遍历*/ #include <stdio.h> #include <stdlib.h> #define MaxVex 100 // ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
随机推荐
- leaflet入门(五)API翻译(下)
L.PointConstructor(函数构造器)Properties(属性)Methods(方法) L.BoundsConstructor(函数构造器)Properties(属性)Methods(方 ...
- leetcode - [6]Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- Java 判断字符串能否转化为数字的三种方法
用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = str.length();--i>=0;){ if (! ...
- hdu 1695 GCD 【莫比乌斯函数】
题目大意:给你 a , b , c , d , k 五个值 (题目说明了 你可以认为 a=c=1) x 属于 [1,b] ,y属于[1,d] 让你求有多少对这样的 (x,y)满足gcd(x,y)= ...
- 怎样去写线程安全的代码(Java)
使用多线程就可能会存在线程安全的问题.很多 java 程序员对写多线程都很挣扎,或者仅仅理解那些是线程安全的代码,那些不是.这篇文章我并不是详述线程安全,详述同步机制的文章,相反我只是用一个简单的非线 ...
- Visualise the Argyris basis functions
""" Author: kinnala Visualise the Argyris basis functions. """ from sk ...
- [logic]逻辑整理
圈子详情页面: 1.加入圈子(*) 1.已登录,直接添加 2.未登录,登陆框 2.发表新帖(*) 1.已登录,直接跳转 2.未登录, ...
- [Chrome_Error] (failed) net::ERR_INCOMPLETE_CHUNKED_ENCODING 与 nginx 502 bad gateway
Chrome 浏览器出现这个错误,还出现 nginx 502 bad gateway . 查看 nginx 的 error.log : 2015/12/18 14:34:44 [error] 1448 ...
- cxGrid实现取消过滤和排序后定位到首行(单选和多选)
cxGrid实现取消过滤和排序后定位到首行(单选和多选) 原创 2013年10月06日 18:42:24 2107 DataContoller中的函数FocusedRecordIndex没有反应,Fo ...
- hdu 1.2.8
#include<cstdio> #include<iostream> using namespace std; int pow(int a,int b) { ; while( ...