写一个dfs算法,c++语言的
时间: 2023-11-17 11:58:22 浏览: 79
好的,我可以帮您解答这个问题。
DFS(Depth First Search)算法是一种常用的图遍历算法,其主要思想是先访问一个顶点,然后依次访问这个顶点的邻接顶点,直到无法继续访问为止,然后回溯到前一个顶点,继续访问前一个顶点的其他邻接顶点,直到所有顶点都遍历完毕。
下面是一个简单的使用DFS算法遍历无向图的C语言代码:
```c
#include <stdio.h>
#define MAX_VERTEX_NUM 100 // 顶点最大数目
typedef int VertexType; // 顶点数据类型
// 邻接表表示图的存储结构
typedef struct ArcNode{
int adjvex; // 邻接点在邻接表中的位置
struct ArcNode *nextarc; // 指向下一个邻接点的指针
}ArcNode;
typedef struct VNode{
VertexType data; // 顶点数据
ArcNode *firstarc; // 指向第一个邻接点的指针
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices; // 图的邻接表
int vexnum, arcnum; // 顶点数和边数
}ALGraph;
// 创建无向图的邻接表
void createALGraph(ALGraph *G){
int i, j, k;
ArcNode *p;
printf("请输入顶点数和边数(以空格分隔):");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入顶点信息:");
for(i = 0; i < G->vexnum; i++){
scanf("%d", &G->vertices[i].data);
G->vertices[i].firstarc = NULL;
}
printf("请输入边的两个顶点序号(以空格分隔):");
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->vertices[i].firstarc;
G->vertices[i].firstarc = p;
// 邻接表插入新边(j,i)
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G->vertices[j].firstarc;
G->vertices[j].firstarc = p;
}
}
// DFS遍历邻接表表示的无向图
void DFS(ALGraph *G, int v, int visited[]){
ArcNode *p;
printf("%d ", G->vertices[v].data);
visited[v] = 1;
p = G->vertices[v].firstarc;
while(p != NULL){
if(visited[p->adjvex] == 0)
DFS(G, p->adjvex, visited);
p = p->nextarc;
}
}
int main(){
ALGraph G;
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有顶点未被访问过
createALGraph(&G);
printf("DFS顶点遍历结果:");
// 从第一个顶点开始遍历
DFS(&G, 0, visited);
printf("\n");
return 0;
}
```
这段代码主要实现了创建邻接表表示的无向图和使用DFS算法遍历无向图的功能。其中,createALGraph()函数用于创建无向图的邻接表,DFS()函数用于遍历图,并输出遍历结果。
阅读全文