zoukankan      html  css  js  c++  java
  • 深度优先遍历图(DFS)

    #include <stdlib.h>
    #include <stdio.h>
    
    #define MAX_NUM 10  //最多可存储的顶点数
    const int NUL = -1;
    
    const int FALSE = -1;
    const int TRUE  = 0;
    int visited[MAX_NUM];  //访问标志组
    
    typedef struct
    {
        int vexs[MAX_NUM];  //顶点数组
        int arcs[MAX_NUM][MAX_NUM];  //邻接矩阵
        int vexnum, arcnum;  //顶点个数 / 弧线个数
    }MGraph;
    
    int CreateUDN(MGraph *_G)
    {
        int i=0, j=0;
        int v1=0, v2=0;  //弧线两端的顶点及弧线权重
    
        printf("Please enter _G->vexnum, _G->arcnum 
    ");
        scanf("%d %d", &(_G->vexnum), &(_G->arcnum));
        
        for(i=0; i<_G->vexnum; i++)  //赋值顶点数组
            scanf("%d", &(_G->vexs[i]));
        printf("Init _G->vexs OK 
    ");
    
        for(i=0; i<_G->vexnum; i++)  //初始化邻接矩阵
            for(j=0; j<_G->vexnum; j++)
                _G->arcs[i][j] = 0;
        printf("Init _G->vexnum OK 
    ");
    
        for(i=0; i<_G->arcnum; i++)  //邻接矩阵赋值
        {
            scanf("%d %d", &v1, &v2);
            _G->arcs[v1][v2] = v1 + v2;
            _G->arcs[v2][v1] = v1 + v2;
        }
        printf("Set _G->arcnum OK 
    ");
    }
    
    /* 获取v的第一个邻接顶点 */
    int FirstAdjVex(const MGraph *_G, int _v)
    {
        int i = 0;
    
        for(i=_v+1; i<_G->vexnum; i++)
        {
            if(_G->arcs[_v][i])
                if(visited[i] == FALSE)
                    return i;
        }
        return -1;
    }
    
    /* 获取v的下一个(费第一个)邻接顶点 */
    int NextAdjVex(const MGraph *_G, int _v)
    {
        int i = 0;
    
        for(i=_v+1; i<_G->vexnum; i++)
        {
            if(_G->arcs[_v][i])
                if(visited[i] == FALSE)
                    return i;
        }
        return -1;
    }
    
    /* 深度优先遍历G */
    void DFS(MGraph *_G, int _v)
    {
        int w = 0;
    
        visited[_v] = TRUE;
    
        printf("%d  ", _G->vexs[_v]);
    
        for(w=FirstAdjVex(_G, _v); w>=0; w=NextAdjVex(_G, _v))
        {
            if(visited[w] == FALSE)
                DFS(_G, w);
        }
    }
    
    void DFSTraverse(MGraph *_G)
    {
        int v = 0;
    
        for(v=0; v<_G->vexnum; v++)
            visited[v] = FALSE;
    
        for(v=0; v<_G->vexnum; v++)
        {
            if(visited[v] == FALSE)
                DFS(_G, v);
        }
    }
    
    int main(void)
    {
        MGraph G;
    
        CreateUDN(&G);
        DFSTraverse(&G);    
    
        exit(0);
    }
  • 相关阅读:
    NumPy笔记:运算符(exp,sqrt,square)
    NumPy笔记:常用操作
    php字符操作
    laravel如何实现批量插入
    php中@符号的作用
    laravel如何实现数据的批量插入
    如何在laravel框架中使用阿里云的oss
    laravle如何设置mysql数据表前缀
    thinkphp视图中如何调用并且向控制器传参数
    thinkphp如何隐藏入口文件index.php
  • 原文地址:https://www.cnblogs.com/MrRS/p/9080305.html
Copyright © 2011-2022 走看看