深度优先遍历图(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 \n");
    scanf("%d %d", &(_G->vexnum), &(_G->arcnum));
    
    for(i=0; i<_G->vexnum; i++)  //赋值顶点数组
        scanf("%d", &(_G->vexs[i]));
    printf("Init _G->vexs OK \n");

    for(i=0; i<_G->vexnum; i++)  //初始化邻接矩阵
        for(j=0; j<_G->vexnum; j++)
            _G->arcs[i][j] = 0;
    printf("Init _G->vexnum OK \n");

    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 \n");
}

/* 获取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);
}

猜你喜欢

转载自www.cnblogs.com/MrRS/p/9080305.html