深度和广度优先

深度优先算法和广度优先算法

深度优先算法DFS(Depth-First-Search)
广度优先算法BFS(Breadth-First-Search)又叫做层次遍历,自上向下,自左向右逐层访问结点,访问完一层再访问下一层,直到无结点。
深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。其实回溯法就是对隐式图的深度优先算法,若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。若图中所有边的长度相等,广度优先搜索算法是最佳解——亦即它找到的第一个解,距离根节点的边数目一定最少;但对一般的图来说,BFS并不一定回传最佳解。这是因为当图形为加权图(亦即各边长度不同)时,BFS仍然回传从根节点开始,经过边数目最少的解;而这个解距离根节点的距离不一定最短。这个问题可以使用考虑各边权值,BFS的改良算法成本一致搜索法来解决。然而,若非加权图形,则所有边的长度相等,BFS就能找到最近的最佳解。

以下是图的深度优先遍历和广度优先遍历的C语言实现: 深度优先遍历: ```c #include<stdio.h> #define MAX 100 int visited[MAX]; //记录节点是否被访问 int G[MAX][MAX]; //邻接矩阵表示图 int n; //节点数 void DFS(int i) { int j; visited[i] = 1; printf("%d ",i); //输出节点i的值 for(j=0;j<n;j++) { if(!visited[j] && G[i][j]==1) //如果节点j未被访问且与节点i相邻 DFS(j); //递归访问节点j } } void DFSTraverse() { int i; for(i=0;i<n;i++) visited[i] = 0; //初始化visited数组 for(i=0;i<n;i++) { if(!visited[i]) //如果节点i未被访问 DFS(i); //从节点i开始深度优先遍历 } } int main() { int i,j; printf("请输入节点数:"); scanf("%d",&n); printf("请输入邻接矩阵:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&G[i][j]); printf("深度优先遍历结果:"); DFSTraverse(); return 0; } ``` 广度优先遍历: ```c #include<stdio.h> #define MAX 100 int visited[MAX]; //记录节点是否被访问 int G[MAX][MAX]; //邻接矩阵表示图 int n; //节点数 void BFS(int i) { int queue[MAX],head=0,tail=0; int j,k; printf("%d ",i); //输出节点i的值 visited[i] = 1; queue[tail++] = i; //将节点i入队 while(head<tail) //队列不为空 { j = queue[head++]; //队头元素出队 for(k=0;k<n;k++) { if(!visited[k] && G[j][k]==1) //如果节点k未被访问且与节点j相邻 { printf("%d ",k); //输出节点k的值 visited[k] = 1; queue[tail++] = k; //将节点k入队 } } } } void BFSTraverse() { int i; for(i=0;i<n;i++) visited[i] = 0; //初始化visited数组 for(i=0;i<n;i++) { if(!visited[i]) //如果节点i未被访问 BFS(i); //从节点i开始广度优先遍历 } } int main() { int i,j; printf("请输入节点数:"); scanf("%d",&n); printf("请输入邻接矩阵:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&G[i][j]); printf("广度优先遍历结果:"); BFSTraverse(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值