给定一个有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 }
#include <stdio.h> #include <stdlib.h> #define MaxVetrexNum 10 #define ERROR -1 typedef int Vertex; typedef Vertex ElementType; typedef int WeightType; /*图数据结构*/ typedef struct GNode *PtrToGNode; struct GNode { int Nv; int Ne; WeightType G[MaxVetrexNum][MaxVetrexNum]; }; typedef PtrToGNode MGraph; /*边数据结构*/ typedef struct ENode *PtrToENode; struct ENode{ Vertex V1, V2; WeightType Weight; }; typedef PtrToENode Edge; struct Node{ Vertex Data; struct Node *next; }; /*队列数据结构*/ typedef struct QNode *PtrToQNode; struct QNode{ struct Node *Front; struct Node *Rear; }; typedef PtrToQNode Queue; /*全局变量*/ int Visited[MaxVetrexNum]; int flag = 0; /*子函数*/ MGraph CreateGraph(int VertexNum); void InsertEdge(MGraph Graph, Edge E); MGraph BuildGraph(int Nv); Queue CreateQ(); int QIsEmpty(Queue Q); void AddQ(Queue Q, ElementType ElemX); ElementType DeleteQ(Queue Q); void DFS(MGraph Graph, Vertex V); void BFS(MGraph Graph, Vertex V, Queue Q); void VisitedClear(MGraph Graph); int main() { int i, j, n, m; MGraph Graph; Queue Q = CreateQ(); scanf("%d", &n); Graph = BuildGraph(n); /*DFS遍历方法*/ for (i = 0; i < n; i++) { if (Visited[i] == 0) { DFS(Graph, i); printf("}\n"); flag = 0; } } VisitedClear(Graph); /*BFS遍历方法*/ for (i = 0; i < n; i++) { if (Visited[i] == 0) { BFS(Graph, i, Q); printf("}\n"); flag = 0; } } system("pause"); return 0; } MGraph CreateGraph(int VertexNum) { MGraph Graph; Vertex v, w; Graph = (MGraph)malloc(sizeof(struct GNode)); Graph->Nv = VertexNum; Graph->Ne = 0; for (v = 0; v < Graph->Nv; v++) { for (w = 0; w < Graph->Nv; w++) Graph->G[v][w] = 0; Visited[v] = 0; } return Graph; } void InsertEdge(MGraph Graph, Edge E) { Graph->G[E->V1][E->V2] = E->Weight; Graph->G[E->V2][E->V1] = E->Weight; } MGraph BuildGraph(int Nv) { MGraph Graph; Edge E; Vertex V; int i; Graph = CreateGraph(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)); E->Weight = 1; InsertEdge(Graph, E); } } return Graph; } Queue CreateQ() { Queue PtrQ = (Queue)malloc(sizeof(struct QNode)); PtrQ->Front = PtrQ->Rear = NULL; return PtrQ; } int QIsEmpty(Queue Q) { if (Q->Front == NULL) return 1; else return 0; } void AddQ(Queue Q, ElementType ElemX) { struct Node *tmp = (struct Node*)malloc(sizeof(struct Node)); tmp->Data = ElemX; if (QIsEmpty(Q)) { Q->Front = tmp; Q->Rear = tmp; } else { Q->Rear->next = tmp; Q->Rear = tmp; } } ElementType DeleteQ(Queue Q) { struct Node *FrontCell; ElementType ElemX; if (Q->Front == NULL) { printf("队列为空"); return ERROR; } FrontCell = Q->Front; ElemX = Q->Front->Data; if (Q->Front == Q->Rear) Q->Front = Q->Rear = NULL; else Q->Front = Q->Front->next; free(FrontCell); return ElemX; } void DFS(MGraph Graph, Vertex V) { Vertex w; if (flag == 0) { flag = 1; printf("{ "); } printf("%d ", V); Visited[V] = 1; for (w = 0; w < Graph->Nv; w++) { if (Visited[w] == 0 && Graph->G[V][w] != 0) { Visited[w] = 1; DFS(Graph, w); } } } void BFS(MGraph Graph, Vertex V, Queue Q) { Vertex w; if (flag == 0) { flag = 1; printf("{ "); } printf("%d ", V); Visited[V] = 1; AddQ(Q, V); while (!QIsEmpty(Q)) { V = DeleteQ(Q); for (w = 0; w < Graph->Nv; w++) { if (Visited[w] == 0 && Graph->G[V][w] != 0) { printf("%d ", w); Visited[w] = 1; AddQ(Q, w); } } } } void VisitedClear(MGraph Graph) { Vertex v; for (v = 0; v < Graph->Nv; v++) Visited[v] = 0; }