题目描述![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6ea3200cc53384fa58e84eb1517cbf26.png)
输入样例:
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 }
思路
- 此题我在此使用邻接矩阵法来解题
- 无向图,因此有边相当于权值为1
- 构造图时,先构造N个顶点,0条边的空图;再输入E条边,将边插入图中(相当于将边的权重设为1)
- DFS类似于树的先序遍历,先访问本节点,再访问未被访问过且与本节点有联系的节点,递归的调用。
- BFS类似于树的层序遍历,将本节点压入队列中,当first<rear,则出队;再将未访问过且与本节点有关的节点全部压入队列中,当first<rear,则出队…递归的调用…
代码
/* 图的邻接矩阵表示法 */
#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100 /* 最大顶点数设为100 */
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
/* 边的定义 */
typedef struct ENode *PtrToENode;
struct ENode{
Vertex V1,V2; /*无向边(V1,V2)*/
WeightType weight; /* 有边权重为1,无边权重为0*/
};
typedef PtrToENode Edge;
typedef struct GNode *PtrToGNode;
struct GNode{
int Nv;
int Ne;
WeightType G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
MGraph BuildGraph();
MGraph CreateGraph(int VertexNum);
void InsertEdge(MGraph Graph,Edge e);
void DFS(MGraph Graph,int v,int visit[]);
void BFS(MGraph Graph,int v,int visit[]);
int main()
{
int i;
MGraph Graph;
int visit[MaxVertexNum] = {0};
Graph = BuildGraph();
/* DFS*/
for(i = 0;i < Graph->Nv;i++)
{
if(visit[i] == 0)
{
printf("{ ");
DFS(Graph,i,visit);
printf("}\n");
}
}
/* 将访问数组全部初始化为0*/
for(int i = 0; i < MaxVertexNum;i++)
{
visit[i] = 0;
}
/* BFS*/
for(i = 0;i < Graph->Nv;i++)
{
if(visit[i] == 0)
{
printf("{ ");
BFS(Graph,i,visit);
printf("}\n");
}
}
}
void BFS(MGraph Graph,int v,int visit[])
{
int i,w;
visit[v] = 1;
int first = -1,rear = -1;
int queue[100];
queue[++rear] = v; /*入队*/
while(first < rear)
{
w = queue[++first]; /*出队*/
printf("%d ",w);
for(i = 0; i < Graph->Nv;i++)
{
if(visit[i] == 0 && Graph->G[w][i] == 1) /*如果顶点未被访问,且与顶点v有关系*/
{
visit[i] = 1; /*标记已访问*/
queue[++rear] = i; /*入队*/
}
}
}
}
void DFS(MGraph Graph,int v,int visit[])
{
int i;
visit[v] = 1;
printf("%d ",v);
for(i = 0; i < Graph->Nv;i++)
{
if(visit[i] == 0 && Graph->G[v][i] == 1) /*如果顶点未被访问,且与顶点v有关系*/
{
DFS(Graph,i,visit);
}
}
}
MGraph CreateGraph(int VertexNum)
{ /* 初始化一个有VertexNum个顶点但没有边的图 */
MGraph Graph;
Graph = (MGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = 0;
/* 初始化邻接矩阵 */
/* 注意:这里默认顶点编号从0开始,到VertexNum也就是(Graph->Nv - 1) */
for(int i = 0;i < VertexNum;i++)
{
for(int j = 0; j < VertexNum;j++)
Graph->G[i][j] = 0;
}
return Graph;
}
void InsertEdge(MGraph Graph,Edge e)
{
/* 无向图 插入边 (V1, V2) */
Graph->G[e->V1][e->V2] = 1;
Graph->G[e->V2][e->V1] = 1;
}
MGraph BuildGraph()
{
int Nv,i;
MGraph Graph;
Edge e;
scanf("%d",&Nv); /* 读入顶点个数 */
Graph = CreateGraph(Nv); /* 初始化有Nv个顶点但没有边的图 */
scanf("%d",&(Graph->Ne)); /* 读入边数 */
if ( Graph->Ne != 0 ) /* 如果有边 */
{
e = (Edge)malloc(sizeof(struct ENode)); /* 建立边结点 */
/* 读入边,格式为"起点 终点",插入邻接矩阵 */
for(i = 0; i < Graph->Ne;i++)
{
scanf("%d %d",&(e->V1),&(e->V2));
InsertEdge(Graph,e);
}
}
return Graph;
}