15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

算法分析和具体步骤解说直接写在代码注释上了

TvT 没时间了等下还要去洗衣服 就先不赘述了

有不明白的欢迎留言交流!(估计是没人看的了)



直接上代码:

  1 #include<stdio.h>
  2 #include<queue>
  3 #include<iostream>
  4 using namespace std;
  5 typedef struct{
  6 int Vex[10];//顶点表
  7 int Edge[10][10];
  8 int vexnum,arcnum;
  9 }MGraph;
 10 bool visited[10];
 11 void printGraph(MGraph &G)
 12 {
 13     cout<<"Show the Graph."<<endl;
 14     cout<<"----------------------------"<<endl;
 15     for(int i=0;i<10;i++){
 16         for(int j=0;j<10;j++)
 17     {
 18         cout<<" "<<G.Edge[i][j]<<" ";
 19     }
 20     cout<<endl;
 21     }
 22     cout<<"----------------------------"<<endl;
 23     cout<<"There are "<<G.arcnum<<" arcs in the Graph!"<<endl;
 24     cout<<"Arcs are listed as follow:"<<endl;
 25     for(int i=0;i<10;i++){
 26         for(int j=0;j<10;j++)
 27     {
 28         if(G.Edge[i][j]==1)
 29             cout<<i<<"-->"<<j<<endl;
 30     }
 31     }
 32 }
 33 int initGraph(MGraph &G)
 34 {
 35     G.vexnum=10;
 36     G.arcnum=0;
 37     for(int i=0;i<10;i++)
 38         for(int j=0;j<10;j++)
 39     {
 40         G.Edge[i][j]=0;
 41     }
 42     cout<<"input the relation of a pair of dots (A,B) to build a graph.(0<A,B<10)"<<endl;
 43     cout<<"End up with data(0,0)"<<endl;
 44     int a,b;
 45     cin>>a>>b;
 46     while(a!=0&&b!=0){
 47     G.arcnum++;
 48     G.Edge[a][b]=1;
 49     cin>>a>>b;
 50     }
 51     cout<<"successful."<<endl;
 52     printGraph(G);
 53 }
 54 bool isNeibour(MGraph &G,int a,int b)
 55 {
 56     if(G.Edge[a][b]==1)
 57         return true;
 58     else return false;
 59 }
 60 int firstNeighbor(MGraph &G,int v)
 61 {
 62     int pos=-1;
 63     for(int i=0;i<G.vexnum;i++)
 64     {
 65         if((G.Edge[v][i]==1))
 66             {pos=i;break;}
 67     }
 68     return pos;
 69 }
 70 int nextNeighbor(MGraph &G,int v,int w)
 71 {
 72     int pos=-1;
 73     for(int i=w+1;i<G.vexnum;i++)
 74     {
 75         if((G.Edge[v][i]==1))
 76         {
 77             pos=i;break;
 78         }
 79     }
 80     return pos;
 81 }
 82 void visit(int v)
 83 {
 84     visited[v]=true;
 85     cout<<v<<" ";
 86 }
 87 queue<int> Q;
 88 void bfs(MGraph G,int v)
 89 {
 90     visit(v);
 91     Q.push(v);
 92     int now;
 93     while(!Q.empty())
 94     {
 95         now=Q.front();
 96         Q.pop();
 97         for(int w=firstNeighbor(G,now);w>=0;w=nextNeighbor(G,now,w))
 98         {
 99             if(!visited[w])
100             {
101                 visit(w);
102                 Q.push(now);
103             }
104         }
105     }
106 }
107 void BFS(MGraph &G)
108 {
109     for(int i=0;i<G.vexnum;i++)
110         visited[i]=false;
111     for(int i=0;i<G.vexnum;i++)
112     {
113         if(!visited[i])
114             bfs(G,i);
115     }
116 }
117 /*DFS 深度优先搜索*/
118 /*类似于树的先序遍历
119 其搜索策略:尽可能【深】地搜索一个图。
120 遍历思想:
121 从一个起始顶点v出发,访问与v邻接但未被访问的任一顶点a→继续访问a顶点的下一未被访问的顶点b→……→无法再向下访问时依次退回到最近被访问的顶点
122 直到所有顶点都被访问为止
123 */
124 void dfs(MGraph &G,int v)
125 {
126     visit(v);
127     int w;
128     for(w=firstNeighbor(G,v);w>=0;w=nextNeighbor(G,v,w))
129     {
130         if(!visited[w])
131         {
132             dfs(G,w);
133         }
134     }
135 }
136 void DFS(MGraph &G)
137 {
138     for(int i=0;i<G.vexnum;i++)
139     {
140         visited[i]=false;
141     }
142     for(int i=0;i<G.vexnum;i++)
143     {
144         if(!visited[i])
145             dfs(G,i);
146     }
147 }
148 int main()
149 {
150     MGraph P;
151     initGraph(P);
152     cout<<"test of BFS:"<<endl;
153     BFS(P);
154     cout<<endl;
155     cout<<"test of DFS:"<<endl;
156     DFS(P);
157     return 0;
158 }

附一张运行截图



15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法

时间: 2024-10-19 23:54:20

15 图-图的遍历-基于邻接矩阵实现的BFS与DFS算法的相关文章

图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)

Adjacency Matrix 邻接矩阵是表示一个图的常用存储表示.它用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息.阶为n的图G的邻接矩阵A是n*n的.将G的顶点标签为v_1,v_2,...,v_n.若(v_i,v_j) \in E(G),A_{ij}=1,否则A_{ij}=0. Depth-First-Search 是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发

邻接矩阵实现Dijkstra算法以及BFS与DFS算法

道理还少说了?我差点都磨破嘴皮子了还是免不了一顿撵打." 位祭酒之一.这三人一般被尊为稷上先生教的可不是一般经书典籍而是圣人大道. 势纳幻依死创圆贪蜕鹤蹬咎丫億矢 大将军旗下一员猛将对上了北凉四牙之一的宁峨眉又如何?一戟而已." 曹摺□ 她瞥了眼竹签便小心收起抬头问道:"是那支签?可别骗我." 菊ж瑾蓊 "咱们公子让你放心佩刀回到陵州不好说但只要是在流州境内没谁敢拿这个说三道四 璩钡垃≥ 粹疑研莱 苏酥到了狭小阴暗的灶房将鲤鱼丢到砧板上推开窗户先淘米煮饭

PTA 邻接矩阵存储图的深度优先遍历

6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVe

练习6.1 邻接矩阵存储图的深度优先遍历 (20分)

试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; t

算法学习 - 图的广度优先遍历(BFS) (C++)

广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不懂的人.请先学下图的存储方法.在我的之前博客里. 传送门:图表示方法 然后我们如果有一个图例如以下: 节点1->3->NULL 节点2->NULL 节点3->2->4->NULL 节点4->1->2->NULL 这样我们已经知道这是一个什么图了. 如果我们

基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS

广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索. BFS的思想: 从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.--Vn,然后依次访问与V1.V2--Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个图.我们采用队列来存储访问过的节点. DFS的思想: 深度优先搜索所遵循的策略就是尽可能"深"的在图中进行搜索,对于图中某一个

基于邻接矩阵存储的图的深度优先遍历和广度优先遍历

图的存储结构相比较线性表与树来说就复杂很多,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放.树结构是一对多的关系,所以我们要将数组和链表的特性结合在一起才能更好的存放. 那么我们的图,是多对多的情况,另外图上的任何一个顶点都可以被看作是第一个顶点,任一顶点的邻接点之间也不存在次序关系. 仔细观察以下几张图,然后深刻领悟一下: 因为任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系(内存物理位置是线性的,图的元素关系是平面的). 如果用多重链表

图 ADT接口 遍历运算 常规运算 邻接矩阵实现

Graph.h   (图的结构, 遍历, 常规操作接口) 1 /*定义图的最大定点数, 它要大于等于具体图的顶点树n*/ 2 #define MaxVertexNum 12 3 4 /*定义图的最大边数,它要大于等于具体图的边数e*/ 5 #define MaxEdgeNum 20 6 7 /* 定义MaxValue 为一个符号常量,其值要大于邻接矩阵中所有有效值之和*/ 8 #define MaxValue 1000 9 10 /*定义MS为一个符号常量,用于广度优先搜索遍历的算法中,作为自定

图的遍历(BFS、DFS的邻接矩阵和邻接表实现)

当年老师给我们讲这里的时候,讲的真是云里雾里的. .其实画个图就很容易理解的事情,为什么扯那么远 我觉得 DFS其实就是树的先序遍历的强化版本 BFS是层序遍历的强化 只不过 图的实现方式比较多元化 而且不像二叉树有明确的根 操作起来相对难一些 理论其实很好理解 就是具体操作起来 每次都很晕的样子 眼高手低了又. 图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上.