图遍历的演示

[问题描述]

  很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示无向图的遍历操作。

以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集。

借助于栈类型(自己定义和实现)将深度优先遍历用非递归算法实现。(非递归算法的实现为选做内容,如能实现,适当加分)

[测试数据]

  在《数据结构》教材中任意找两个无向图作为测试数据。

[实现提示]

  设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒。

下面是代码:

广搜的:

#include<cstdio>
#include<cstring>

const int NN=100;//点的数量
const int MM=1000;//边的数量

/* 邻接表 */
struct G
{
    int v,next;
}E[MM];
int p[NN],T;
/* 搜索标记数组 */
int dd[NN];
/* 用数组实现队列 */
int qw[NN];

/* 记录边集 */
int to[MM][2];
int tol; //边的个数

void add(int u,int v)
{
    E[T].v=v;
    E[T].next=p[u];
    p[u]=T++;
}

void find_path(int st,int n)
{
    int i,u,v,head,tail;
    for(i=1;i<=n;i++)
        dd[i]=-1;
    dd[st]=0;
    qw[head=tail=0]=st;

    printf("遍历顺序为:\n%d",st);

    while(head<=tail)
    {
        u=qw[head++];
        for(i=p[u];i+1;i=E[i].next)
        {
            v=E[i].v;
            if(dd[v]==-1)
            {
                printf(" %d",v);

                to[tol][0]=u;
                to[tol++][1]=v;

                dd[v]=dd[u]+1;
                qw[++tail]=v;
            }
        }
    }

    puts("");
}

int main()
{
    int u,v,n,m;

    printf("输入点和边的数量\n");
    scanf("%d%d",&n,&m);

    /* 初始化 */
    memset(p,-1,sizeof(p));
    T=0;
    tol=0;

    printf("输入边的信息\n");
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }

    int x=1;//x可以是任意一个点

    find_path(x,n);

    printf("边集\n");
    for(int i=0;i<tol;i++)
    {
        printf("%d %d\n",to[i][0],to[i][1]);
    }

    return 0;
}

深搜的:

#include<cstdio>
#include<cstring>

const int NN=100;//点的数量
const int MM=1000;//边的数量

/* 邻接表 */
struct G
{
    int v,next;
}E[MM];
int p[NN],T;
/* 搜索标记数组 */
bool vis[NN];

/* 记录边集 */
int to[MM][2];
int tol; //边的个数

void add(int u,int v)
{
    E[T].v=v;
    E[T].next=p[u];
    p[u]=T++;
}

void dfs(int x)
{
    for(int i=p[x];i+1;i=E[i].next)
    {
        int v=E[i].v;
        if(!vis[v])
        {
            printf(" %d",v);

            to[tol][0]=x;
            to[tol++][1]=v;

            vis[v]=true;
            dfs(v);
        }
    }
}

int main()
{
    int u,v,n,m;

    printf("输入点和边的数量\n");
    scanf("%d%d",&n,&m);

    /* 初始化 */
    memset(vis,false,sizeof(vis));
    memset(p,-1,sizeof(p));
    T=0;

    printf("输入边的信息\n");
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }

    int x=1;//x可以是任意一个点
    vis[x]=true;
    printf("遍历顺序为:\n%d",x);
    dfs(x);
    puts("");

    printf("边集\n");
    for(int i=0;i<tol;i++)
    {
        printf("%d %d\n",to[i][0],to[i][1]);
    }

    return 0;
}


注意:MM存的是双向边,所以MM的上限值应该是输入的边(m)的两倍。边集,输出顺序,是有序的,我是默认图是连通的。

图遍历的演示,布布扣,bubuko.com

时间: 2024-08-03 17:24:35

图遍历的演示的相关文章

实验报告图遍历的演示

#include <stdio.h> #include <stdlib.h> #define MAX 30 #define N 30 #define M 10 #define NULL 0 typedef struct ebox{ int ivex,jvex; struct ebox *ilink,*jlink; }ebox,*pebox; typedef struct vexbox{ char *data; pebox firstedge; }vexbox,*pvexbox; t

图遍历问题

图遍历问题分为四类 遍历完所有的边而不能有重复,即所謂“一笔画问题”或“欧拉路径”: 遍历完所有的顶点而没有重复,即所谓“哈密尔顿问题”. 遍历完所有的边而可以有重复,即所谓“中国邮递员问题”: 遍历完所有的顶点而可以重复,即所谓“旅行推销员问题”. 对于第一和第三类问题已经得到了完满的解决,而第二和第四类问题则只得到了部分解决. 第一类问题就是研究所谓的欧拉图的性质,而第二类问题则是研究所谓的哈密尔顿图的性质. 图的基本知识 顶点:图中的数据元素称为顶点 有向图:有方向的图叫有向图 无向图:没

树遍历以及图遍历的方法

树遍历: 根节点=D=Degree  左节点=L=Left  右节点=R=Right 1.前序遍历(DLR) 2.中序遍历(LDR) 3.后序遍历(LRD) 4.层次遍历(一层一层的遍历) 前三种遍历均可用递归或者非递归的方式来遍历. 层次遍历可以设一个队列,把元素放在队列里,每次输出队头元素. 图遍历: 1.广度优先遍历 也称为广度优先搜索(BFS)(类似于树的层次遍历) 2.深度优先遍历 也称为深度优先搜索(DFS) (类似于树的前序遍历) 这两种遍历均可用来判断图的连通性. 原文地址:ht

数据结构作业--图遍历

数据结构老师布置一道题目,憋了一天才搞出来,还是练习地不够啊!不过班里面其他人搞出来的也不多啊! 题目 PS:头文件是老师给的. 一.请建立一个空项目,添加GraphTraverseTest.cpp源文件和AdjMWGraph.h.AdjLWGraph.h.CreatAdjWGraph.h.AdjWGraphApp.h.SeqList.h.SeqQueue.h等六个头文件.其中: AdjMWGraph.h头文件采用邻接矩阵实现带权有向图数据结构:    AdjLWGraph.h头文件采用邻接表实

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序訪问"图"中全部的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现. 广度优先(优先走近期的).用的数据结构是队列.主要是迭代实现. 对于深搜.因为递归往往能够方便的利用系统栈,不须要自己维护栈.所以通常实

路径寻找(隐式图遍历)

八数码难题 参考代码:(刘汝佳<算法竞赛入门经典>,源代码在首页置顶区的代码仓库 编码和解码 //无权图上的最短路,可用BFS求解 #include<bits/stdc++.h> using namespace std; const int MAX = 1000000; typedef int State[9] ; // 定义"状态"类型 State st[MAX],goal;//状态数组 int dis[MAX];//距离数组 //ps: 如果需要答应路径,

C#与数据结构--图的遍历

C#与数据结构--图的遍历 8.2 图的存储结构 图 的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区 中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多.常用的图的存储结构有邻接矩阵.邻接表.十字链表和邻接多重表. 8.2.1  邻接矩阵表示法 对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系.图8.10和图8.11中,矩阵A(i,j)=1

41 蛤蟆的数据结构笔记之四十一图的遍历之深度优先

41  蛤蟆的数据结构笔记之四十一图的遍历之深度优先 本篇名言:"对于我来说 , 生命的意义在于设身处地替人着想 , 忧他人之忧 , 乐他人之乐. -- 爱因斯坦" 上篇我们实现了图的邻接多重表表示图,以及深度遍历和广度遍历的代码,这次我们先来看下图的深度遍历. 欢迎转载,转载请标明出处: 1.  原理 图遍历又称图的遍历,属于数据结构中的内容.指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它