广度优先搜索与深度优先搜索

广度优先搜索

typedef struct {
    int que[MaxVertexNum];
    int rear,front;
}Queue;//广度优先搜索队列的存储结构
int visit[MaxVertexNum];//全局变量数组
void BFS(MGraph &M,int v){
    printf("广度优先搜索:");
    Queue q;
    int v1;
    for(int i=0;i<MaxVertexNum;i++){
        visit[i]=0;
    }
    q.rear=0;
    q.front=0;
    q.que[q.rear++]=v;
    visit[v]=1;
    visited(v);
    while(q.front!=q.rear){
        v1=q.que[q.front++];
        for(int j=0;j<M.vertexnum;j++){
            if(M.Edge[v1][j]!=0&&visit[j]==0){
                q.que[q.rear++]=j;
                visited(j);
                visit[j]=1;
            }
        }
    }
}

深度优先搜索

一.递归深度优先搜索

int visit[MaxVertexNum];//全局变量数组
void DFSTraverse(){
    for(int i=0;i<MaxVertexNum;i++){
        visit[i]=0;//访问标记数组重置
    }
    printf("递归深度优先搜索:");
}
void DFS1(MGraph &M,int v){
    visited(v);
    visit[v]=1;
    for(int i=0;i<M.vertexnum;i++){
        if(M.Edge[v][i]!=0&&visit[i]==0){
            DFS1(M,i);
        }
    }
}

二.非递归深度优先搜索

int visit[MaxVertexNum];//全局变量数组
void DFS1(MGraph &M,int v){
    visited(v);
    visit[v]=1;
    for(int i=0;i<M.vertexnum;i++){
        if(M.Edge[v][i]!=0&&visit[i]==0){
            DFS1(M,i);
        }
    }
}//递归实现深度优先搜索
void DFS2(MGraph &M,int v){
    printf("非递归深度优先搜索:");
    int flag=0;
    for(int i=0;i<MaxVertexNum;i++){
        visit[i]=0;
    }
    visited(v);
    visit[v]=1;
    flag++;
    while(flag!=M.vertexnum){//若flag等于图的点数表示,所有节点已访问完毕
        int j;
        for(j=0;j<M.vertexnum;j++){
            if(M.Edge[v][j]!=0&&visit[j]==0){
                visited(j);
                visit[j]=1;
                flag=flag+1;//若成功访问一次则标志位加1
                break;
            }
        }
        v=j;
    }
}

 找出定点U到定点V全部简单路径

思想:采用深度优先遍历

void FindPath(ALGraph &G,int u,int v,int path[MaxVertexNum],int d){
    int w;
    ArcNode *p;
    path[d++]=u;//将可能的路径节点u入数组
    visited[u]=1;
    if(u==v){
        for(int i=0;i<d;i++){cout<<path[i]<<" ";}
        cout<<endl;
    }
    p=G.vertices[u].first;//p指向第一个相邻节点
    while(p!=NULL){
        w=p->adjvex;
        if(visited[w]==0){FindPath(G,w,v,path,d);}
        p=p->next;
    }
    visited[u]=0;
}

 

posted on 2019-08-18 21:25  一仟零一夜丶  阅读(446)  评论(0)    收藏  举报