给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 v2 ... vk }"的格式,每行输出一个连通集。先输出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 }
我的代码(g++6.5.0)
#include <iostream>
#define MaxVertexNum 10
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
typedef int WeightType; /* 边的权值设为整型 */
typedef struct GNode *PtrToGNode;
struct GNode {
int Nv; /* 顶点数 */
int Ne; /* 边数 */
WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */
MGraph createGraph(int VertexNum) {
Vertex V, W;
MGraph Graph = (MGraph)malloc(sizeof(struct GNode)); //建立图
Graph->Nv = VertexNum;
Graph->Ne = 0;
/* 初始化邻接矩阵 */
/* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
for (V = 0; V < Graph->Nv; V++)
for (W = 0; W < Graph->Nv; W++)
Graph->G[V][W] = 0; //初始0,表示顶点间无边
return Graph;
}
void insertEdge(MGraph Graph,Vertex V, Vertex W) {
Graph->G[V][W] = 1; //1表示两个顶点间存在边
Graph->G[W][V] = 1;
}
typedef struct Queue *PtrToQueue;
struct Queue {
int Front;
int Rear;
int maxSize;
Vertex Arr[MaxVertexNum+1]; //留一空间不存储数据,仅用于判断是否为空
};
typedef PtrToQueue Que;
Que createQue() { //用循环数组表示队列
Que Q = (Que)malloc(sizeof(struct Queue)); //建立队列
Q->maxSize = MaxVertexNum+1;
Q->Front = 0;
Q->Rear = 0;
return Q;
}
bool QueIsFull(Que Q) {
if ((Q->Rear + 1)%Q->maxSize == Q->Front) return true;
else return false;
}
bool QueIsEmpty(Que Q) {
if (Q->Rear == Q->Front) return true;
else return false;
}
void EnterQue(Que Q, Vertex V) {
if (QueIsFull(Q)) return;
Q->Rear = (Q->Rear + 1) % Q->maxSize;
Q->Arr[Q->Rear] = V;
}
Vertex DelQue(Que Q) {
if (QueIsEmpty(Q)) return -1;
Q->Front = (Q->Front + 1) % Q->maxSize;
return Q->Arr[Q->Front];
}
Vertex visited[MaxVertexNum]; //记录已被遍历的节点
void DFS(MGraph Graph, Vertex V) {
visited[V] = true;
printf(" %d",V);
for (Vertex W = 0; W < MaxVertexNum;W++) {
if (Graph->G[V][W] == 1 && !visited[W])
DFS(Graph,W);
}
}
void BFS(MGraph Graph,Vertex V,Que Q) {
visited[V] = true;
EnterQue(Q,V);
while (!QueIsEmpty(Q)) {
Vertex W = DelQue(Q);
printf(" %d", W);
for (Vertex U= 0; U < MaxVertexNum; U++) {
if (Graph->G[W][U] == 1 && !visited[U]) {
visited[U] = true;
EnterQue(Q, U);
}
}
}
}
int main()
{
int N,E;
int i;
scanf("%d %d
",&N,&E);
//rewind(stdin); //清空键盘文件缓存,用于VS调试,待删除
MGraph Graph = createGraph(N);
Que Q = createQue();
for (i = 0; i < E;i++) {
Vertex V, W;
scanf("%d %d
", &V, &W);
insertEdge(Graph, V, W);
//rewind(stdin); //清空键盘文件缓存,用于VS调试,待删除
}
for (i = 0; i < N;i++) {
if (visited[i] == false) {
printf("{");
DFS(Graph,i);
printf(" }
");
}
}
for (i = 0; i < N; i++) visited[i] = false; //重新初始化visited数组值为false
for (i = 0; i < N; i++) {
if (visited[i] == false) {
printf("{");
BFS(Graph, i, Q);
printf(" }
");
}
}
return 0;
}