图结构实验2(接上一篇)

第4关:深度优先生成树

任务描述

本关任务:构造无向图的深度优先搜索树。

相关知识

实验目的

  1. 掌握图的基本概念;
  2. 掌握图的存储结构的设计与实现,基本运算的实现;
  3. 熟练掌握图的两种遍历算法、遍历生成树及遍历算法的应用。

实验任务

说明:为使实验程序简洁直观,下面的部分实验程序中的一些功能实现仍以调用库函数程序"graph.h"中的函数的形式给出,并假设该库函数中定义了图结构的类型、结构以及其他一些有关图、边、顶点等的基本操作和函数。

实验说明

图结构及其类型描述

在本头文件中,用自然数表示顶点号。所涉及到的图可以是无向图、有向图、带权图(即网络)等形式。在内部采用邻接表存储,但用户不必关心其具体的存储形式,因为有关的内容可通过头文件中所提供的函数获得。 图结构类型datagraph的描述如下:

 
  1. struct datagraph
  2. {
  3. bool direct; //是否是有向的
  4. bool flag; //表示这条边是否存在
  5. };

构建图

为了使同学们不因为复杂的存储结构而分散精力,本实训使用图的邻接矩阵来存储图,也就是datagraph类型的二维数组,datagraph[i][j]表示顶点i到顶点j的边的信息。 如需了解图的邻接表存储结构,推荐一种比较方便的链式前向星存储结构,同学们可以去网上自行查阅相关知识。

编程要求

请在右侧编辑器的命名空间内填写相关代码,实现对给定的图G及出发点u,设计算法从u出发深度遍历图G,并构造出相应的生成树。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

数据说明:

  • 保证数据给出的图为简单无向联通图;
  • 保证数据给出的图的顶点数不超过 100;
  • G[u][v] 表示的是 u+1 和 v+1 的边。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. vector<int> solve(vector<vector<datagraph> > & G, int u);
  3. 参数 G 为图的邻接矩阵,参数 u 为给定的顶点
  4. 返回一个一维数组表示从点 u 出发通过深度优先遍历依次访问的节点序列。
  5. 右侧数据框说明:
  6. 测试输入:
  7. 第一行三个整数 n,m 和 k,n 表示图的顶点总数,m 表示图的边或弧总数,k 表示图是否为有向图,若 k = 1 则表示图为有向图,若 k = 0 则表示图为无向图
  8. 接下来 m 行每行两个整数 u 和 v,表示有一条边或弧 uv 存在
  9. 最后一行一个整数 u,表示给定的顶点
  10. 实际输出:
  11. 输出你返回数组
  12. 结构体说明:
  13. struct datagraph
  14. {
  15. bool direct; //是否是有向的
  16. bool flag; //表示这条边是否存在
  17. };
  18. 库函数详细可查看右侧头文件 "graph.h"

开始你的任务吧,祝你成功!

#include "graph.h"   // ÒýÓÿ⺯ÊýÎļþ
namespace exa {     //ÇëÔÚÃüÃû¿Õ¼äÄÚ±àд´úÂ룬·ñÔòºó¹û×Ô¸º

vector<int> vec;
bool *visited = new bool[100];
void fun(vector<vector<datagraph> > & G,int u)
{
    int item = u-1;
    visited[item] = 1;
    vec.push_back(u);
    vector<datagraph>::iterator first=G[item].begin(),last=G[item].end();
    for(int i=0;first!=last;first++,i++)
    {
        if(!visited[i] && (*first).flag==1)
        {
            fun(G,i+1);
        }
    }
}
vector<int> solve(vector<vector<datagraph> > & G, int u) { 
    for(int i=0;i<G.size();i++)
        visited[i] = 0;
    int item = u-1;
    visited[item] = 1;
    vec.push_back(u);
    vector<datagraph>::iterator first=G[item].begin(),last=G[item].end();
    for(int j=0;first!=last;first++,j++)
    {
        if(visited[j]==0 && G[item][j].flag==1)
        {
            fun(G,j+1);
        }
    }
    for(int i=0;i<G.size();i++)
    {
        if(visited[i]==0)
        {
            fun(G,i+1);
        }
    }
    return vec;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值