zoukankan      html  css  js  c++  java
  • 数据结构之图的创建,广搜和深搜

    说明:

    本文使用邻接矩阵表示一个无向图,在此基础上尝试了三种搜索方法,广度优先,深度优先和非递归的深度优先

    发现博客还是挺难写的

    // project1.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include<string.h>
    #include<stdio.h>
    #include<queue>
    #include<stack>
    
    #define MAX 100
    
    //邻接矩阵表示法
    typedef struct{
        char vexs[MAX];//定点数组
        int edges[MAX][MAX];//边的数组
        int vexnum,edgenum;
    }MGraph;
    
    //创建图矩阵
    void createMGraph(MGraph *g){    
        printf("input vexnum and edgenum:
    ");
        scanf("%d,%d",&g->vexnum,&g->edgenum);
    
        fflush(stdin);
        printf("input every vertex id:
    ");
        for(int i=0;i<g->vexnum;i++){//初始化顶点信息
            scanf("%c",&g->vexs[i]);
            fflush(stdin);
        }
        for(int i=0;i<g->vexnum;i++)//初始化矩阵
            for(int j=0;j<g->vexnum;j++)
                g->edges[i][j]=0;
        printf("input edges with format i,j
    ");
        char svex,tvex;
        for(int k=0;k<g->edgenum;k++){
            scanf("%c,%c",&svex,&tvex);
            fflush(stdin);
            int i,j;
            for(i=0;g->vexs[i]!=svex;i++);//找到编号
            for(j=0;g->vexs[j]!=tvex;j++);
            g->edges[i][j]=1;
            g->edges[j][i]=1;//无向图,双向
        }
    }
    
    int findVex(MGraph* g,char vex){
        for(int i=0;i<g->vexnum;i++)
            if(g->vexs[i]==vex)
                return i;
        return -1;
    }
    
    //宽度优先搜索图矩阵
    void BFS_MGgraph(MGraph *g,char beg_vex){
        bool visited[MAX]={false};//记录某顶点是否已访问
        int pos;
        using namespace std;
        queue<char> que;
    
        //注意要在入队时做访问标记,如果出队才做标记则队中会有多个相同的顶点
        if((pos=findVex(g,beg_vex))!=-1)
            visited[pos]=true;
        que.push(beg_vex);//初始点入队
        while(! que.empty()){//当队列不空
            char vex=que.front();que.pop();
            printf("%c ",vex);
            //寻找vex的子节点,然后将其入队
            for(int i=0;i<g->vexnum;i++){
                pos=findVex(g,g->vexs[i]);
                if(pos!=-1 && visited[pos]==false && g->edges[findVex(g,vex)][pos]==1){//未访问过且有边相连
                    //入队
                    visited[pos]=true;
                    que.push(g->vexs[i]);
                }
            }
        }
    }
    
    //DFS搜索图矩阵
    bool visited2[MAX]={false};
    void DFS_MGraph(MGraph* g,char beg_vex){
        printf("%c ",beg_vex);
        int pos=findVex(g,beg_vex);
        if(pos!=-1)    
            visited2[pos]=true;
        //寻找beg_vex的子节点
        for(int i=0;i<g->vexnum;i++){
            pos=findVex(g,g->vexs[i]);
            if(pos!=-1 && visited2[pos]==false && g->edges[findVex(g,beg_vex)][pos]==1){//未访问过且有边相连
                DFS_MGraph(g,g->vexs[i]);
            }
        }
    }
    
    //非递归DFS搜索图矩阵
    bool visited3[MAX]={false};
    void ncur_DFS_MGraph(MGraph* g,char beg_vex){
        using namespace std;
        stack<char> stk;
    
        stk.push(beg_vex);//初始点入栈
        int pos=findVex(g,beg_vex);
        //注意要在入栈时做访问标记,如果出栈才做标记则队中会有多个相同的顶点
        if(pos!=-1)    
            visited3[pos]=true;
        
        while(! stk.empty()){
            char vex=stk.top();stk.pop();
            printf("%c ",vex);
    
            //寻找vex的子节点
            for(int i=g->vexnum-1;i>=0;i--){
                pos=findVex(g,g->vexs[i]);
                if(pos!=-1 && visited3[pos]==false && g->edges[findVex(g,vex)][pos]==1){//未访问过且有边相连
                    stk.push(g->vexs[i]);
                    visited3[i]=true;
                }
            }
        }
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        
        MGraph *g=new MGraph();
        createMGraph(g);
        char beg_vex='f';
        BFS_MGgraph(g,beg_vex);
        printf("
    ");
        DFS_MGraph(g,beg_vex);
        printf("
    ");
        ncur_DFS_MGraph(g,beg_vex);
        printf("
    ");
        delete g;
        return 0;
    }
    
    
    
     
    
     
  • 相关阅读:
    学习进度表
    mysql实现跨库查询
    jmeter分布式(1台Windows,一台Mac,亲测可用互相使用)
    解决appium 连接真机Android 9启动报错.....shell "ps 'uiautomator'
    使用fiddler抓包修改请求/返回的数据
    adb 获取当前界面activity
    使用adb 命令获取APP包名
    jmeter实现登录并设置token为全局变量
    python3 SystemError: Parent module '' not loaded, cannot perform relative import
    adb 运行提示error: cannot connect to daemon
  • 原文地址:https://www.cnblogs.com/abc123456789/p/3433429.html
Copyright © 2011-2022 走看看