图的遍历
来源:互联网 发布:魔仙晶石链淘宝 编辑:程序博客网 时间:2024/05/18 04:49
一 图的深度优先遍历
1.算法思想
类似树的先根遍历。设初始化时,图中各顶点均未被访问,从图中某个顶点(设为V0)出发,访问V0,然后搜索V0的一个邻接点Vi,若Vi未被访问,则访问之,在 搜索Vi的一个邻接点(深度优先)…。若某顶点的邻接点全部访问完毕,则回溯到它的上一顶点,然后再从此顶点又按深度优先的方法搜索下去,…,直到能访问的顶点都访问完毕为止。
2.算法实现(C语言)
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef char VertexType;typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc;} ArcNode;typedef struct VNode{ VertexType data; ArcNode *firstarc;} VNode;typedef struct ALGraph{ VNode adjlist[MAXSIZE]; int vexnum,arcnum;} ALGraph;int visited[MAXSIZE] = {0};//创建图ALGraph CreateALGraph(ALGraph G){ int i,j,k; ArcNode *p,*q; printf("请输入顶点数和边数:\n"); scanf("%d,%d",&(G.vexnum),&(G.arcnum)); printf("请输入顶点信息:\n"); for(i = 0; i < G.vexnum; i ++) { fflush(stdin); scanf("%c",&(G.adjlist[i])); G.adjlist[i].firstarc = NULL; } printf("请输入边的信息:\n"); for(k = 0; k < G.arcnum; k ++) { scanf("%d,%d",&i,&j); //i为弧尾,j为弧头 p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = G.adjlist[i].firstarc; G.adjlist[i].firstarc = p; //j为弧尾,i为弧头 q = (ArcNode *)malloc(sizeof(ArcNode)); q->adjvex = i; q->nextarc = G.adjlist[j].firstarc; G.adjlist[j].firstarc = q; } return G;}void DFS(ALGraph G,int v){ ArcNode *p; printf("%c",G.adjlist[v].data); visited[v] = 1; p = G.adjlist[v].firstarc; while(p != NULL) { if(visited[p->adjvex] == 0) { DFS(G,p->adjvex); } p = p->nextarc; }}int main(){ ALGraph G; G = CreateALGraph(G); printf("遍历结果为:"); DFS(G,0); return 0;}
二 图的广度优先遍历
1.算法思想
类似树的按层次遍历。初始时,图中各顶点均未被访问,从图中某顶点(V0)出发,访问V0,并依次访问V0的各邻接点(广度优先)。然后,分别从这些被访问过的顶点出发,扔仍按照广度优先的策略搜索其它顶点,….,直到能访问的顶点都访问完毕为止。
为控制广度优先的正确搜索,要用到队列技术,即访问完一个顶点后,让该顶点的序号进队。然后取相应队头(出队),考察访问过的顶点的各邻接点,将未访问过的邻接点访问 后再依次进队,…,直到队空为止。
2.算法实现(C语言)
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef char VertexType;typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc;} ArcNode;typedef struct VNode{ VertexType data; ArcNode *firstarc;} VNode;typedef struct ALGraph{ VNode adjlist[MAXSIZE]; int vexnum,arcnum;} ALGraph;int visited[MAXSIZE] = {0};//创建图ALGraph CreateALGraph(ALGraph G){ int i,j,k; ArcNode *p,*q; printf("请输入顶点数和边数:\n"); scanf("%d,%d",&(G.vexnum),&(G.arcnum)); printf("请输入顶点信息:\n"); for(i = 0; i < G.vexnum; i ++) { fflush(stdin); scanf("%c",&(G.adjlist[i])); G.adjlist[i].firstarc = NULL; } printf("请输入边的信息:\n"); for(k = 0; k < G.arcnum; k ++) { scanf("%d,%d",&i,&j); //i为弧尾,j为弧头 p = (ArcNode *)malloc(sizeof(ArcNode)); p->adjvex = j; p->nextarc = G.adjlist[i].firstarc; G.adjlist[i].firstarc = p; //j为弧尾,i为弧头 q = (ArcNode *)malloc(sizeof(ArcNode)); q->adjvex = i; q->nextarc = G.adjlist[j].firstarc; G.adjlist[j].firstarc = q; } return G;}void Visit(ALGraph G,int v){ printf("%c",G.adjlist[v].data);}void BFS(ALGraph G,int v){ ArcNode *p; int j; int que[MAXSIZE]; int rear,front; rear = front = 0; Visit(G,v); visited[v] = 1; //当前顶点入队 que[rear] = v; rear = (rear+1)%MAXSIZE; //队空时说明遍历完成 while(front != rear) { //顶点出队 j = que[front]; front = (front+1)%MAXSIZE; p = G.adjlist[j].firstarc; while(p != NULL) { //当前顶点未被访问则进队 if(visited[p->adjvex] == 0) { Visit(G,p->adjvex); visited[p->adjvex] = 1; //该顶点入队 que[rear] = p->adjvex; rear = (rear+1)%MAXSIZE; } //p指向j的下一条边 p = p->nextarc; } }}int main(){ ALGraph G; G = CreateALGraph(G); printf("遍历结果为:"); BFS(G,0); return 0;}
0 0
- 图:图的遍历(深度优先遍历、广度优先遍历)
- java图的遍历方式(深度遍历、广度遍历)
- java图的遍历方式(深度遍历、广度遍历)
- 图的遍历(深度遍历和广度遍历)
- 图的遍历:深度优先遍历和广度优先遍历
- 图的 深度遍历 广度遍历
- 图的深度遍历和广度遍历
- 图的遍历(深度优先遍历)
- 图的遍历:深度优先遍历
- 图的遍历:宽度优先遍历
- 图的广度遍历和深度遍历
- 图的深度遍历和广度遍历
- 图的遍历-深度优先遍历
- 图的遍历-广度优先遍历
- 图的dfs遍历和bfs遍历
- 图的深度遍历和广度遍历
- 图的遍历算法-马遍历棋盘
- 图的遍历算法-马遍历棋盘
- VIM 的配置 .vimrc
- 跟着郝斌学数据结构(04)——链表【链表的操作】
- JAVA程序员一定知道的优秀第三方库(2016版)
- Canvas绘制线段和圆
- linux文件属性与权限
- 图的遍历
- 【Android动画九章】-浮动菜单
- 在PPT中让文字根据需要改变颜色方法
- java30接口的异常(一)
- 设计模式-享元模式(Flyweight)的分析说明和Android中的关键应用
- 使用JNDI访问SQL Server数据库(tomcat服务器)
- 子页面获取父页面的iframe的信息
- 按钮添加活动指示器
- 客户端与服务器端