【图论】实现图的遍历算法

14人阅读 评论(0) 收藏 举报
分类:

这里写图片描述传送门

递归深度优先遍历

#include<stdio.h>
#include<malloc.h>
#define MAXV 100
#define INF 32767
typedef struct ANode
{
    int adjvex;
    int weight;
    struct ANode *nextarc;
} ArcNode;

typedef struct
{
    int count;
    ArcNode *firstarc;
} VNode;

typedef struct
{
    VNode adjlist[MAXV];
    int n, e;
}AdjGraph;

int visit[MAXV] = { 0 };

void CreateAdj(AdjGraph* &G, int A[MAXV][MAXV], int n, int e);
void DFS(AdjGraph *G, int v);

int main()
{
    AdjGraph * G;
    int n = 6, e = 10;
    int A[MAXV][MAXV] = { { 0, 5, INF, 7, INF, INF },
    { INF, 0, 4, INF, INF, INF },{ 8, INF, 0, INF, INF, 9 },
    { INF, INF, 5, 0, 5 },{ INF, INF, INF, 5, 0, INF },{ 3, INF, INF, INF, 1, 0 } };
    CreateAdj(G, A, n, e);
    printf("从0开始的DFS算法: ");
    DFS(G, 0);
    printf("\n");
    return 0;
}

void DFS(AdjGraph *G, int v) //递归深度优先遍历算法
{
    ArcNode *p;
    printf("%d ", v);
    visit[v] = 1;
    p = G->adjlist[v].firstarc;
    while (p != NULL)
    {
        if (visit[p->adjvex] == 0)
            DFS(G, p->adjvex);
        p = p->nextarc;
    }
}

void CreateAdj(AdjGraph* &G, int A[MAXV][MAXV], int n, int e)  //创建图的邻接表
{
    ArcNode *p;
    G = (AdjGraph*)malloc(sizeof(AdjGraph));
    for (int i = 0; i < n; ++i)
        G->adjlist[i].firstarc = NULL;
    for (int i = 0; i < n; ++i)
        for (int j = n - 1; j >= 0; --j)
            if (A[i][j] != 0 && A[i][j] != INF)
            {
                p = (ArcNode *)malloc(sizeof(ArcNode));
                p->weight = A[i][j];
                p->adjvex = j;
                p->nextarc = G->adjlist[i].firstarc;
                G->adjlist[i].firstarc = p;
            }
    G->n = n;
    G->e = e;
}

运行结果:
这里写图片描述

查看评论

图论(三)图的遍历

图建构好后,针对具体的问题,我们常常需要通盘的读取图中的信息,包括顶点(vertex)和边(edge),以及它们之间的关系。这种读取图中所有信息的方法就是图的遍历(traversal),也称为搜索(s...
  • saltriver
  • saltriver
  • 2017年01月14日 21:03
  • 3796

《图论》——广度优先遍历算法(BFS)

十大算法之广度优先遍历: 本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下: 用邻接矩阵存储图方法: 1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组v...
  • Gamer_gyt
  • Gamer_gyt
  • 2015年07月30日 11:57
  • 2408

【经典算法】:图的遍历算法的实现

#include #include "StdAfx.h" #define MAX 20 #include "malloc.h" int visited[MAX]; //访问标志数组 ...
  • qq_23100787
  • qq_23100787
  • 2016年06月07日 15:53
  • 640

《图论》——图的存储与遍历(Java)

一:图的分类 1:无向图         即两个顶点之间没有明确的指向关系,只有一条边相连,例如,A顶点和B顶点之间可以表示为 也可以表示为,如下所示                       ...
  • Gamer_gyt
  • Gamer_gyt
  • 2016年05月25日 15:28
  • 9255

2015年大二上-数据结构-图-1-(3)图遍历算法实现

测试时用的图是 /* *Copyright (c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:Annpion.cpp *作者:王耀鹏 *完成日期:2016年...
  • Annpion
  • Annpion
  • 2016年01月24日 11:15
  • 1002

关于图的遍历算法

前些天做算法设计实验,涉及到图的遍历的一些算法,由于数据结构是在去年学的,很多算法也有些记不清了,今天在网上看到了一篇好的博文,留作看吧. 转载自海子的: http://www.cnblogs.c...
  • u013518289
  • u013518289
  • 2015年11月28日 12:15
  • 3123

图的遍历算法(DFS和BFS)

1.    图的深度遍历DFS 可采用递归和循环两种方式实现。 方法一:采用递归的方式。 定义一个标志数组表示某个结点是否已经被访问过。以邻接矩阵的形式表示图。依次对深度遍历图中的每个未被遍历过的结...
  • u010339647
  • u010339647
  • 2016年08月20日 19:29
  • 1776

图遍历算法实现

问题及代码: 问题描述: 实现图遍历算法,分别输出如下图结构的深度优先(DFS)遍历序列和广度优先遍历(BFS)序列。 输入描述: 若干测试数据。 程序 深度优先便利(DFS): (1...
  • wangjiyuan123
  • wangjiyuan123
  • 2015年11月23日 16:22
  • 274

数据结构 - 图的遍历

图的遍历图的遍历(Traversing Graph):从图的某一顶点出发,访遍图中的其余顶点,且每个顶点仅被访问一次。 图的遍历算法是各种图的操作的基础。但图的遍历存在以下特点: ◆ 复...
  • wangzi11322
  • wangzi11322
  • 2015年05月01日 07:31
  • 2304

C++ 图的遍历(广度优先遍历)

上篇深度优先遍历(DFS)的时候,在二维矩阵中,把标识放在了side上,在上面还感觉没有啥子影响,但由于广度遍历的时候,标记的设置要放在push到queue中的时候,就比较难受,所以最好还是把访问标识...
  • nightwizard2030
  • nightwizard2030
  • 2017年05月07日 21:05
  • 441
    个人资料
    持之以恒
    等级:
    访问量: 650
    积分: 40
    排名: 189万+
    文章存档