图的遍历 DFS(深度优先),BFS(广度优先)
来源:互联网 发布:刘双军网络二胡教学15 编辑:程序博客网 时间:2024/05/01 06:46
#include <iostream> #include <string> #include <queue> using namespace std; //表结点 typedef struct ArcNode{ int adjvex;//该弧所指向的顶点的位置 ArcNode *nextarc;//指向下一条弧的指针 }ArcNode; //头结点 typedef struct VNode{ string data;//顶点信息 ArcNode* firstarc;//第一个表结点的地址,指向第一条依附该顶点的弧的指针 }VNode, AdjList[10]; typedef struct{ AdjList vertices; int vexnum, arcnum;//图的顶点数和弧数 }ALGraph; int LocateVex(ALGraph G, string u)//返回顶点u在图中的位置 { for(int i=0; i<G.vexnum; i++) if(G.vertices[i].data==u) return i; return -1; } void CreateUDG(ALGraph &G)//构造无向图 { string v1, v2; int i, j, k; cout<<"请输入顶点数和边数:"; cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:"; for(i=0; i<G.vexnum; i++) { cin>>G.vertices[i].data; G.vertices[i].firstarc=NULL; } cout<<"请输入边:"; cout<<endl; for(k=0; k<G.arcnum; k++) { cin>>v1>>v2; i=LocateVex(G, v1); j=LocateVex(G, v2); //插入v1的邻接表,为了提高效率,总在表头插入结点。 ArcNode *arc=new ArcNode; arc->adjvex=j; arc->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=arc; //插入v2的邻接表,为了提高效率,总在表头插入结点。 arc=new ArcNode; arc->adjvex=i; arc->nextarc=G.vertices[j].firstarc; G.vertices[j].firstarc=arc; } } void Print(ALGraph G)//打印邻接表 { cout<<"打印邻接表如下:"; cout<<endl; for(int i=0; i<G.vexnum; i++)//遍历每个顶点的邻接表 { cout<<G.vertices[i].data; ArcNode *p=G.vertices[i].firstarc; while(p) { cout<<"->"<<G.vertices[p->adjvex].data; p=p->nextarc; } cout<<endl; } } int FirstAdjVex(ALGraph G, int v)//返回顶点v的第一个邻接点序号 { ArcNode *p=G.vertices[v].firstarc; if(p) return p->adjvex; else return -1; } int NextAdjVex(ALGraph G, int v, int w)//返回顶点v的相对于w的下一个邻接点序号 { ArcNode* p=G.vertices[v].firstarc; while(p) { if(p->adjvex==w) break; p=p->nextarc; } if(p->adjvex!=w || !p->nextarc)//如果没找到w或者w是最后一个邻接点 return -1; return p->nextarc->adjvex; } bool visited[10]; void DFS(ALGraph G, int v) { visited[v]=true; cout<<G.vertices[v].data<<" "; for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w) ) if(!visited[w]) DFS(G, w); } void DFSTraverse(ALGraph G)//深搜 { for(int i=0; i<G.vexnum; i++) visited[i]=false; for(i=0; i<G.vexnum; i++) if(!visited[i]) DFS(G, i); } void BFSTraverse(ALGraph G)//广搜 { queue<int> q; for(int i=0; i<G.vexnum; i++) visited[i]=false; for(i=0; i<G.vexnum; i++) { if(!visited[i]) { q.push(i); visited[i]=true; while(!q.empty()) { int v=q.front(); q.pop(); cout<<G.vertices[v].data<<" "; for(int w=FirstAdjVex(G, v); w>=0; w=NextAdjVex(G, v, w)) { if (!visited[w]) { q.push(w); visited[w]=true; } } } } } } void main() { ALGraph G; CreateUDG(G); Print(G); cout<<"深搜:"; DFSTraverse(G); cout<<endl; cout<<"广搜:"; BFSTraverse(G); cout<<endl; }
0 0
- 图的遍历 DFS(深度优先),BFS(广度优先)
- 图的深度/广度优先遍历(BFS DFS)
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)--解析
- 基于图的深度优先遍历(DFS)与广度优先遍历(BFS)
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 邻接表实现--图的深度优先遍历DFS和广度优先遍历BFS
- 图的 储存 深度优先(DFS)广度优先(BFS)遍历
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
- 深度优先遍历(DFS)和广度优先遍历(BFS)
- 树的广度深度优先遍历算法 DFS BFS
- 二叉树的深度优先遍历(DFS)与广度优先遍历(BFS)
- DOM中BFS(广度优先遍历)和DFS(深度优先遍历)的方法
- Java数据结构----图--深度优先遍历BFS和广度优先遍历DFS
- Java数据结构----图--深度优先遍历BFS和广度优先遍历DFS
- 图的遍历记(深度和广度优先搜索—BFS&&DFS)的笔记
- sass 错误笔记
- setTimeout和setInterval的区别你真的了解吗?
- Jquery中易混淆的选择器
- Android应用权限管理总结
- 时间to_date,层级查询 --工作备忘2016/1/8
- 图的遍历 DFS(深度优先),BFS(广度优先)
- gradle老问题
- Android4.0窗口机制和创建过程分析
- Android实现静默安装与卸载
- Hadoop经典案例Spark实现(六)——求最大的K个值并排序
- java中的Cipher类
- Parcelable 复杂对象,对象列表等
- tcpdump filters for HTTP GET & HTTP POST
- 在iPhone5以上机器显示iPhone4尺寸的launchImage