图的邻接表(数组实现)建立,广度和深度搜索。。
2014-12-27 16:25
344 查看
#include<stdio.h> #include<string.h> // 有向图的建立 和遍历 // 有向图的建立 int n,m;// n 顶点数 m 边数 int visit[1001];//记录各顶点是否被访问 int countt;// 记录边数 int head[1001];// 头结点 存的值是 边所在的位置 head[]的下标为头结点 typedef struct EDGE{ int v; int next;// next 为 边所指向的下一条边所在的位置 }EDGE; EDGE edge[2001]; // edge[] 下标为边所在的位置 void addedge(int u,int v){ edge[countt].v = v; edge[countt].next = head[u]; head[u] = countt++; } void bfs(int start){ int que[1001];// 自行构造的队列 int ft=0,bk=0; // ft 队首,bk队尾 visit[start] = 1; que[bk++] = start; int vd; while(ft<bk){ vd = que[ft++]; printf("%d ",vd); for(int ege = head[vd];ege!= -1;ege = edge[ege].next){ int v = edge[ege].v; if(!visit[v]){ que[bk++] = v; visit[v] = 1; } } } } void dfs(int i){ printf("%d ",i); visit[i] = 1; for(int eg = head[i];eg != -1;eg = edge[eg].next){ int v = edge[eg].v; if(!visit[v]){// if判断的是 i 顶点与 哪个顶点j相连,并且顶点j 未被访问过 dfs(v); } } } int main(){ printf("先输入顶点数,后边数:\n"); while(scanf("%d%d",&n,&m)){ countt = 0; memset(visit,0,sizeof(visit)); for(int i = 1;i <= n;i++){ head[i] = -1;// 初始化各顶点 所指向的边的位置为-1 } int u,v;// 相邻的u ,v 顶点 for(int i = 1;i <= m;i++){ scanf("%d%d",&u,&v); addedge(u,v); } int start;// 遍历的起点; printf("输入遍历的起点:"); scanf("%d",&start); printf("图的广搜:"); bfs(start); for(int i = 1;i<=n;i++){ // 图有可能是未联通的 if(!visit[i]) bfs(i);} printf("\n"); memset(visit,0,sizeof(visit)); printf("图的深搜:"); dfs(start); for(int i = 1;i <= n;i++){ if(!visit[i])dfs(i);//图有可能是未联通的 } } }
相关文章推荐
- 数据结构上机实验--有向图邻接表的建立,深度广度搜索及拓扑排序
- 用邻接表实现深度和广度搜索
- C语言实现图的邻接表的创建以及深度搜索和广度搜索
- 基于C++ STL图的邻接表表示及深度、广度搜索实现
- 图---邻接表(建立,深度遍历,广度遍历)
- 无权图无向图【邻接矩阵存储】深度搜索和广度搜索--Java实现
- 图基本算法 图搜索基于邻接表的(广度优先、深度优先)
- 迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现
- 图---邻接表的深度搜索与广度搜索测试一
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
- 基于邻接表实现的DFS深度优先搜索
- c++实现树的广度搜索和深度搜索完整代码
- 图---邻接表(建立,深度遍历,广度遍历)
- c++实现树的广度搜索和深度搜索完…
- 图的邻接表表示法及深度搜索与广度搜索
- 图的邻接表表示、广度优先、深度优先搜索
- 22.基于 邻接表 表示的 深度优先搜索dfs 和 广度优先搜索bfs
- 图的基本操作:图的创造(基于邻接表)、深度搜索(DFS)、广度搜索(DFS)
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
- 深度优先搜索和广度优先搜索的代码实现