给定一个有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-