知识大全 邻接表表示的图的深度优先搜索和广度优先搜索程序
Posted 结点
篇首语:知识是为老年准备的最好食粮。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 邻接表表示的图的深度优先搜索和广度优先搜索程序相关的知识,希望对你有一定的参考价值。
邻接表表示的图的深度优先搜索和广度优先搜索程序
#include <stdio h>#define maxvertexnum #define queuesize #define null
typedef struct int front rear count data[queuesize]; cirqueue;//循环队列结构定义
typedef int vertextype;//为了简单 设图中结点的数据为整型typedef struct node int adjvex;//存放邻接点序号 struct node *next;//指向下一个边结点 edgenode;//图的邻接表的边结点定义
typedef struct vnode vertextype vertex;//顶点数据域 edgenode *firstedge;//指向第一个边结点 vertexnode;//图的邻接表表示的顶点结点定义
typedef vertexnode adjlist[maxvertexnum];//用向量定义图的邻接表表示的顶点表
typedef struct adjlist adjlist; int n;//图的顶点数 int e;//图的边数 algraph;//定义图的邻接表
typedef enumFALSE TRUEboolean;boolean visited[maxvertexnum];//保存访问信息的布尔向量
main()//主函数 //建立图g 并进行深度优先搜索和广度优先搜索 algraph *g; g=(algraph*)malloc(sizeof(algraph));//申请图g的邻接表空间 createalgraph(g);//建立图g的邻接表表示 printf( the dfs is: );/ dfstraverse(g);//对图g进行深度优先搜索 并打印搜索序列 printf( the bfs is: ); bfstraverse(g);//对图g进行广度优先搜索 并打印搜索序列
createalgraph(algraph *g) //建立图g的邻接表表示 int i j k; int flag; edgenode *s; printf( \\ncreat:\\n )//选择建立有向图或无向图 printf( digraph \\n ); printf( undigraph \\n ); scanf( %d &flag); printf( input n e\\n ); scanf( %d%d &g >n &g >e);//输入图g的顶点数和边数 printf( input nodes:\\n ); for(i= ;i<g >n;i++)//构造一个只含n个顶点 边数为 的图 scanf( %d &(g >adjlist[i] vertex)); //输入顶点的数据域(为了简单起见 输入为整数) g >adjlist[i] firstedge=null;//将顶点结点的firstedge域置为空 //end for for(k= ;k<g >e;k++) printf( input i j( ~n ):\\n ); scanf( %d%d &i &j);//输入对应于一条边的顶点序号序偶对 要求顶点序号为 ~n s=(edgenode *)malloc(sizeof(edgenode));//申请一个边结点*s s >adjvex=j;//将序号j放入边结点*s的adjvex域 s >next=g >adjlist[i] firstedge; //将边结点*s作为第一个邻接点插入到序号为i的顶点的边表中 g >adjlist[i] firstedge=s; if (flag)//若要建立无向图 s=(edgenode *)malloc(sizeof(edgenode));申请一个边结点*s s >adjvex=i;//将序号i放入边结点*s的adjvex域 s >next=g >adjlist[j] firstedge; //将边结点*s作为第一个邻接点插入到序号为j的顶点的边表中 g >adjlist[j] firstedge=s; //end of if //end of for //end of creatalgraph
dfs(algraph *g int i) //对图g进行以序号为i的顶点作为出发点深度优先搜索 edgenode *p; printf( visit vertex:%d g >adjlist[i] vertex);//打印序号为i的顶点信息 visited[i]=TRUE;//将序号为i的顶点设置已访问过标记 p=g >adjlist[i] firstedge;//设置寻找序号为i的第一个未访问过邻接点的扫描指针 while(p) if (!visited[p >adjvex])//若*p边结点对应顶点(假设序号为j)未访问过 dfs(g p >adjvex);//对图g进行以序号为j的顶点作为出发点进行深度优先搜索 p=p >next;//p顺着边表next指针 往后继续寻找 //end of while //end of dfs
dfstraverse(algraph *g) //对以邻接表表示的图g进行深度优先搜索 int i; for(i= ;i<g >n;i++)//将图g的所有顶点设置未访问过标记 visited[i]=FALSE; for(i= ;i<g >n;i++)//对图g调用dfs函数进行深度优先搜索 if(!visited[i]) dfs(g i); printf( \\n ); //end of dfstraverse
bfs(algraph *g int k) //对图g进行以序号为k的顶点作为出发点广度优先搜索 int i j; cirqueue *q;//设置循环队列指针 edgenode *p; q=(cirqueue *)malloc(sizeof(cirqueue));//申请循环队列空间 q >rear=q >front=q >count= ;//将循环队列置为空队 printf( visit vertex:%d g >adjlist[k] vertex); visited[k]=TRUE;//将序号为k的顶点设置为已访问过 q >data[q >rear]=k;q >rear=(q >rear+ )%queuesize;q >count++;//将顶点序号k入队 while(q >count)//当队列非空时做以下操作 i=q >data[q >front];q >front=(q >front+ )%queuesize;q >count ;//将队首元素i出队 p=g >adjlist[i] firstedge;//设置寻找序号为i顶点的未访问过邻接点的扫描指针p while (p)//当*p不为空时 做以下操作 if(!visited[p >adjvex])//若*p边结点对应顶点(假设序号为j)未访问过 printf( visit vertex:%d g >adjlist[p >adjvex] vertex); //访问序号为j的顶点 visited[p >adjvex]=TRUE;//设置已访问过标记 q >data[q >rear]=p >adjvex;q >rear=(q >rear+ )%queuesize;q >count++; //将序号为j的顶点入队 //end of if p=p >next;//p顺着边表next指针 往后继续寻找 //end of while //end of while //end of bfs
cha138/Article/program/sjjg/201311/23272相关参考
图的遍历 图的遍历(TraversingGraph)从图中某一顶点出发访遍图中其余顶点且使每一个顶点仅被访问一次 图的遍历有两种方法深度优先搜索和广度优先搜索 深度优先遍历 深度优先遍
.已知连通图如下 ().给出本图的邻接表 ().若从顶点B出发对该图进行遍历在()的基础上分别给出本图的按深度优先搜索和按广度优先搜索的顶点序列 ().写出按深度优先搜索的递归程序【厦门大学
希赛教育计算机专业考研专业课辅导招生 希赛教育计算机专业考研专业课辅导视频 希赛教育计算机考研专业课在线测试系统 将顶点v放在上方中央其余顶点按从v到该顶点的最短路径长度分别放在第和层上则图
图的遍历概念 图的遍历 和树的遍历类似图的遍历也是从某个顶点出发沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问它是许多图的算 法的基础 深度优先遍历和广度优先遍历是最为重要的两种遍历
深度优先遍历序列 对图进行深度优先遍历时按访问顶点的先后次序得到的顶点序列称为该图的深度优先遍历序列或简称为DFS序列 ()一个图的DFS序列不一定惟一 当从某顶点x出发搜索时若x的邻接点有
.下面的邻接表表示一个给定的无向图 ()给出从顶点v开始对图G用深度优先搜索法进行遍历时的顶点序列 ()给出从顶点v开始对图G用广度优先搜索法进行遍历时的顶点序列【复旦大学六(分)) .给出
.设无向网G如 ().设顶点abcdefh的序号分别为请列出网G的邻接矩阵画出网G的邻接表结构: ().写出从顶点a出发按深度优先搜索和广度优先搜索方法遍历网G所的到的顶点序列 按Prim算
.对有五个结点ABCDE的图的邻接矩阵 ().画出逻辑图 ().画出图的十字链表存储 ().基于邻接矩阵写出图的深度广度优先遍历序列 ().计算图的关键路径【华南师范大学三(分)】 .何
试在无向图的邻接矩阵和邻接链表上实现如下算法 ()往图中插入一个顶点 ()往图中插入一条边 ()删去图中某顶点 ()删去图中某条边下面的伪代码是一个广度优先搜索算法试以图(下图)中的v为源点
.已知无向图如下所示 ().给出从V开始的广度优先搜索序列().画出它的邻接表 ().画出从V开始深度优先搜索生成树【燕山大学五(分)】 第题图