图之深搜与广搜

邻接矩阵的定义:

#define MAXVEX 100
typedef char VertexType;
typedef int EdgeType;
struct GraphStruct;
typedef struct GraphStruct *Graph;
struct GraphStruct{
    VertexType vexs[MAXVEX]; /*顶点,下标从0开始*/
    EdgeType edge[MAXVEX][MAXVEX]; /*邻接矩阵*/
    int vertexNum,edgeNum;
};
邻接表的定义:
#define MAXVEX 100 /*最大顶点数*/
typedef char VertexType;
struct GraphStruct;
typedef struct GraphStruct *Graph;

typedef struct ENode{
    int adjVertex;  /*该边所指的顶点的位置*/
    int weight;     /*边的权*/
    struct ENode *nextEdge;  /*指向下一条边的指针*/
}ENode;

typedef struct VNode{
    VertexType data;   /*顶点信息*/
    ENode *firstEdge; /*指向第一条依附该顶点的边的弧指针*/
}VNode;

struct GraphStruct{
    VNode vexs[MAXVEX];
    int vertexNum,edgeNum; /*图的当前顶点数和弧数*/
};


无向带权图(邻接表)

完成void BFS(Graph g,int k)函数,该函数从第k个点开始广度优先遍历图g,遍历过程中把访问过的顶点的visited设置为1(初始为0)。请注意,在测试代码中已经完成int locateVertex(Graph g, VertexType v);函数(在图g中查找顶点v的序号,不存在返回-1),你可以直接调用。

我们这里怎么实现图的深搜:

void DFS(Graph g,int v0)
{
	ENode* p; 
	int w;
	g->vexs[v0].visited=1;
	p=g->vexs[v0].firstEdge;
	while(p!=NULL){//每一个while循环,都是同一个节点的边。 
		w=p->adjVertex;
		if(g->vexs[w].visited==0){
			DFS(g,w);//每一次DFS都是更进一层的循环 
		}
		p=p->nextEdge;
	}
}

实现图的广搜:

void BFS(Graph g,int k)
{
	queue<int> q;
	ENode *p;
	g->vexs[k].visited=1;
	q.push(k);
	int v,w;
	while(q.size()){//循环一次,访问一个节点的所有边
		v=q.front();
		q.pop();
		p=g->vexs[v].firstEdge;
		while(p!=NULL){
			w=p->adjVertex;
			if(g->vexs[w].visited==0){
				g->vexs[w].visited=1;
				q.push(w);//将边对应的节点放到队列里面
			}
		p=p->nextEdge;
		}
	}
} 

无向带权图(邻接矩阵)

在这里我们怎么实现图的深搜:

void DFS(Graph g, int i)  
{  
   
    g->visited[i] = 1;  
    for(int j = 0; j < g->vertexNum; j ++){
    	if(g->edge[i][j] == 1 && g->visited[j] == 0) {
    		 DFS(g,j); 
    	}      
    }           
}  

在这里我们怎么实现图的广搜:

void BFS(Graph g,int i)
{
    queue<int> q;
    q.push(i);
    int v;
    while(q.size()){
	i=q.front();
	q.pop();
	for(int j=0;j<g->vertexNum;j++){
	    if(g->edge[i][j]==1 && g->visited[j]==0){
	        g->visited[j]=1;
                q.push(j);
	    }	
        }                                                                                                    
    }
} 

深搜:


广搜:

扫描二维码关注公众号,回复: 3449075 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41861526/article/details/80439938
今日推荐