06-图1 列出连通集 (25分)
给定一个有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 }
解题思路:利用邻接表进行DFS和BFS;在输出结果时,有一点要注意,题目指出每次进行搜索都需要从编号最小的顶点出发,因此在插入结点到邻接表时,要进行排序,否则输出的结果无法通过;
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 11
typedef int Vertex;//定义结点编号
typedef struct ENode {
//图结点数据
Vertex V1, V2;
} *Edge;
typedef struct AdjVNode {
//邻接表结点数据
Vertex AdjV;
struct AdjVNode *next;
}*PtrToAdjVNode;
typedef struct VNode {
//邻接表数据
PtrToAdjVNode FirstEdge;
}AdjList[MaxSize];
typedef struct GNode {
//图的数据
int Nv;
int Ne;
AdjList G;
int Visited[MaxSize];
}*LGraph;
typedef struct Queue {
int rear;
int tail;
int data[MaxSize];
int num;
}*Queue;
LGraph BulidGraph ( );//建立一个邻接表
LGraph CreateGraph (int Nv);//建立一个空的邻接表
void InsertEdge (LGraph Graph, Edge E);//将一个结点插入到邻接表中
void DFS (LGraph Graph, Vertex V);//进行DFS
void BFS (LGraph Graph, Vertex V);//BFS
Queue CreateQueue ();//创建一个空队列
void AddQ (Queue Q, int data);//将一个元素插入队列中
int Delete(Queue Q);//从队列中删除一个元素
int main () {
Vertex V;
int i;
LGraph Graph = BulidGraph(); //建立一个邻接表
for (i = 0; i < Graph->Nv; i++) {
//将Visited需要搜索的部分置为0,1代表结点已搜索
Graph->Visite