• 图的深搜广搜


    
    
    //图 存顶点 存边 存顶点数 存边数
    //用临接表存储
    #include <iostream>
    
    typedef struct bian
    {
        int j;
        struct bian* next;
    };
    //每一个点存储自己的边表,每个点最多10条边
    typedef struct dian
    {
        char a;
        bian* bianbiao ;
    };
    //图存储边数,点数,以及点的集合,最多20个点
    typedef struct graph
    {
        int n,e;
        struct dian dianbiao[20];
    };
    
    
    struct graph mygraph;
    int visited[20];
    void buildgraph()
    {
        for(int i = 0;i<20;i++)
            visited[i]=0;
        printf("请输入边数和点数\n");
        scanf("%d %d",&mygraph.e,&mygraph.n);
        getchar();
        //printf("请输入点的名字\n");
        for(int i = 0;i<mygraph.n;i++)
        {
            scanf("%c",&mygraph.dianbiao[i].a);
            getchar();
            mygraph.dianbiao[i].bianbiao= NULL;
        }
        //printf("请输入边的编号");
        int i,jj;
        //设成有向边
        for(int t = 0;t<mygraph.e;t++)
        {
            scanf("%d %d",&i,&jj);
            //加入链表
            bian* newbian = (bian*)malloc(sizeof(bian));
            newbian->j = jj;
            newbian->next = mygraph.dianbiao[i].bianbiao;
            mygraph.dianbiao[i].bianbiao = newbian;
        }
        return;
    }
    //参数为点的序号
    void dfs(int i)
    {
        //输出本身的值
        if(visited[i]==0)
        {
            printf("%c ",mygraph.dianbiao[i].a);
            visited[i] = 1;
            while(mygraph.dianbiao[i].bianbiao!=NULL)
            {
                dfs(mygraph.dianbiao[i].bianbiao->j);
    
                mygraph.dianbiao[i].bianbiao = mygraph.dianbiao[i].bianbiao->next;
                if(mygraph.dianbiao[i].bianbiao !=NULL)
                    dfs(mygraph.dianbiao[i].bianbiao->j);
    
            }
        }
        
    }
    
    typedef struct queue
    {
        dian queuedata[100];
        int front;
        int rear;
    };
    queue myqueue;
    
    void init()
    {
        myqueue.front = 0;
        myqueue.rear = 0;
    
        for(int i = 0;i<100;i++)
        {
            myqueue.queuedata[i].a = NULL;
            myqueue.queuedata[i].bianbiao = NULL;
        }
        return ;
    }
    void inqueue(dian * _dian)
    {
        if(myqueue.front == 100)
            exit(1);
        myqueue.queuedata[myqueue.front].a = _dian->a;
        myqueue.queuedata[myqueue.front].bianbiao = _dian->bianbiao;
        myqueue.front++;
        return;
    }
    bool isEmpty()
    {
        return myqueue.front == myqueue.rear;
    }
    dian* outqueue()
    {
        dian* ret;
        if(myqueue.rear<myqueue.front)
        {
            ret = &(myqueue.queuedata[myqueue.rear]);
            myqueue.rear++;
        }
        
        return ret;
    }
    void bfs()
    {
        inqueue(&(mygraph.dianbiao[0]));
        visited[0] = 1;
        dian *temp;
        while(isEmpty()==0)
        {
            temp = outqueue();
            printf("%c ",temp->a);
     
            while(temp->bianbiao!=NULL)
            {
                if(visited[temp->bianbiao->j]==0)
                {
                    inqueue(&(mygraph.dianbiao[temp->bianbiao->j]));
                    visited[temp->bianbiao->j] = 1;
                    temp->bianbiao = temp->bianbiao->next;
                }
                else
                    temp->bianbiao = temp->bianbiao->next;
            }
        }
    }
    int main()
    {
        buildgraph();
        //深搜
        /*for(int i = 0;i<mygraph.n;i++)
        {
            if(visited[i]==0)
            dfs(i);
        }*/
        
        //广搜
        bfs();
        return 0;
    }
    
    //测试数据
    //8 6
    //a b c d e f
    //0 1
    //0 5
    //0 4
    //1 5
    //1 2
    //3 2
    //3 5
    //4 3
    
    
    
    
    
  • 相关阅读:
    oracle中查看sql语句的执行计划
    linux跨主机复制文件
    linux主机登录另一台linux主机
    JVM内存监控:visualVM jconsole jstatd jmap
    linux shell自动输入实现
    awk 截取字符串
    dos2unix dos文本转换为linux文本 /bin/bas^M:bad interpreter
    EasyUI
    Jquery插件 easyUI属性汇总
    移动端省际联动插件mobiscroll
  • 原文地址:https://www.cnblogs.com/qingcheng/p/3113646.html
Copyright © 2020-2023  润新知