题目
#include <stdio.h>
typedef enum {false, true} bool;
#define MaxVertexNum 10 /* 最大顶点数设为10 */
#define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void Visit( Vertex V )
{
printf(" %d", V);
}
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
int main()
{
MGraph G;
Vertex V;
G = CreateGraph();
scanf("%d", &V);
printf("DFS from %d:", V);
DFS(G, V, Visit);
return 0;
}
/* 你的代码将被嵌在这里 */
关于参数中‘void (*Visit)(Vertex)’的粗略说明:
void (*Visit)(int) 是一个函数指针类型参数,它指向一个函数,该函数的参数是一个整数。
在这个例子中,DFS函数通过这个函数指针参数来指定对顶点进行访问时所要执行的操作。具体来说,这个函数指针作为参数提供了函数VIsit的地址(但没有访问之类的操作!gpt竟然还告诉我会直接调用函数,就不用在DFS内部访问了,哼!)。
AC代码
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) )
{
Visit(V);
Visited[V] = true;
for(int i=0; i<MaxVertexNum; i++)
{
if(Graph->G[V][i] == 1 && Visited[i] == false)
{
// Visited[i] = true;
DFS(Graph, i, Visit);
}
}
}
易错点
1. 邻接矩阵的构造方式题目没有给出,但从提交尝试中发现,两个相连结点对应邻接矩阵的值为 1,但不相连结点对应的值不是INFINITY(题目给出的无穷)!所以判断是否有连接,if 中需用‘Graph->G[V][i] == 1’而不是‘Graph->G[V][i] != INFINITY’来 判断。
2.需要在for循环之前就更新Visited数组的值!细读题目注释交代会发现,主函数中只实现了将visited全部处理为false的操作,但并没有将初始访问的结点置为true,这就要求我们在函数中一开始就更新visited的值。(哎,函数题往往难就难在找到与主函数的默契点~)
~ 希望对你有帮助 ~