图的深度和广度优先遍历c语言
时间: 2023-06-21 07:21:47 浏览: 89
图的深度、广度优先遍历(c语言)
5星 · 资源好评率100%
以下是图的深度优先遍历和广度优先遍历的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;
}
```
阅读全文