C 图的构建 简单的BFS和DFS 06-图1 列出连通集 (25分)

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:
按照格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

输出样例:

{
    0 1 4 2 7 }
{
    3 5 }
{
    6 }
{
    0 1 2 7 4 }
{
    3 5 }
{
    6 }

解题
标准方法建立一个图;
建立BFS,DFS函数遍历图;
主要学习图种各个结构的设置方法;

用数组表示图

1.设置图结构
可以通过 MGraph对象->Nv得到图的顶点数
MGraph对象->Ne得到图的边数

#include<iostream>
#include<queue>
#define MaxVertexNum 11
using namespace std;
typedef int WeightType;
typedef struct GNode *PtrToGNode;
struct GNode
{
   
	int Nv;     //顶点数 
	int Ne;     //边数
	WeightType G[MaxVertexNum][MaxVertexNum];  //列表存放图 
	//若顶点有数据
	/*
	DataType Data[MaxVertexNum];
	*/ 
};
typedef PtrToGNode MGraph; //以邻接矩阵存储的图类型
//MGraph 为指向图对象的指针

2.造图函数
先得到图种顶点的个数,由此构建一个N个顶点的图,
但不添加边;
返回图的对象指针;

typedef int Vertex;   //用顶点下标表示顶点,为整型
MGraph CreateGraph( int VertexNum)
{
   
	Vertex V,W;     //v,w为顶点下标 
	MGraph Graph;   //graph为指向图类型的指针;
	
	Graph=new struct GNode;   //新建一个图空间
	Graph->Nv = VertexNum;       //图的顶点数为输入的值 
	Graph->Ne = 0;       //图的边数为0
	
	//图的内容存在G种,编号从0到nv-1 
	for(V=0;V<Graph->Nv;V++)
		for(W=0;W<Graph->Nv;W++)
			Graph->G[V][W] = 0;  //全部置0,表示没有边
	
	return Graph;       //返回指向新建图的指针 
} 

3.边结构
构造边的结构,为后续往图种添加边做准备
Edge对象->V1,得到边左顶点的坐标;
Edge对象->V2,得到边右顶点的坐标;
Weight为边权重,可以读入,也可以自己设置为1;

typedef struct ENode *PtrToENode;   //指向边结构的指针 
struct ENode{
         //边结构 
	Vertex V1,V2;   //有向边<V1,V2> 
	WeightType Weight=1;  //边的权重 
};
typedef PtrToENode Edge;       //Edg为指向边的指针

4.插入边函数

//往graph内插入边E 
void InsertEdge(MGraph Graph, Edge E)
{
   
	Graph->G[E->V1][E->V2] = E->Weight;  //图内数组对应的位置放入权重
	//无向图,则还要放一波
	Graph->G[E->V2][E->V1] = E->Weight;
} 

5.建造图函数
先读入结点数——建造n个结点的无边图;
读入边数——挨个往无边图种插入边;
最后返回插入了边的图;

MGraph BuildGraph()     //创建一个图 
{
   
	MGraph Graph;  //图类型 Graph 
	Edge E;        //边类型E 
	Vertex V;      //顶点类型 V 
	int Nv, i;
	
	scanf("%d",&Nv); //读入图的大小 
	Graph = CreateGraph(Nv);    //创建一个有Nv个顶点的图
	scanf("%d",&(Graph->Ne)); //读入图的边数
	if(Graph->Ne !=0)   //边数不为0 
	{
   
		E= new struct ENode;     //E指向新建的边空间
		for(i =0 ; i<Graph-
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值