数据结构PTA 基础实验6-2.1 列出连通集
2020-07-26 20:18
603 查看
基础实验6-2.1 列出连通集
题目
给定一个有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 }
解法
思路
这就是一道深度优先遍历和广度优先遍历的题目。
- 因为此图的顶点较少,可以使用邻接矩阵存储,并且不必要用动态矩阵。
- 在进行深度优先遍历时,只需要用好Visited数组即可,保证下次迭代访问的顶点不仅是此时的邻接点,还要求没有被访问。
- 在进行广度优先遍历时,需要涉及到队列的操作:创建一个空队、顶点入队、顶点出队、判断队是否为空。在这里为了简便起见,用数组作为队的构成方式,当然也可以用链表。
广度优先遍历需要刚开始的时候就入队一个顶点,然后进入while循环,只要队不空,这个循环一直做。循环内就是弹出队列的一个顶点,然后按照大小顺序,遍历此点的所有邻接点,并把这些点入队。
实现
#include<stdio.h> #include<stdlib.h> #define MAXN 10 #define INFINITY 100000 #define MAXSIZE 10+1 typedef int WeightType; typedef int Vertex; typedef struct QNode *Queue; struct QNode { int Start; int End; Vertex Arr[MAXSIZE]; }; typedef struct GNode *PtrToGNode; typedef PtrToGNode MGraph; struct GNode { int Nv; int Ne; WeightType G[MAXN][MAXN]; }; typedef struct ENode *PtrToENode; typedef PtrToENode Edge; struct ENode { Vertex V1, V2; WeightType W; }; MGraph CreateGraph(int VertexNum) { Vertex i,j; MGraph Graph = (MGraph)malloc(sizeof(struct GNode)); Graph->Nv = VertexNum; Graph->Ne = 0; for(i=0; i<Graph->Nv; i++) for(j=0; j<Graph->Nv; j++) Graph->G[i][j] = INFINITY; return Graph; } void InsertEdge(MGraph Graph, Edge E) { Graph->G[E->V1][E->V2] = E->W; Graph->G[E->V2][E->V1] = E->W; } MGraph BuildGraph(int VertexNum, int EdgeNum) { MGraph Graph = CreateGraph(VertexNum); Graph->Ne = EdgeNum; int i; Edge E = (Edge)malloc(sizeof(struct ENode)); for(i=0; i<Graph->Ne; i++) { scanf("%d %d", &E->V1, &E->V2); E->W = 1; InsertEdge(Graph, E); } return Graph; } void Visit(Vertex i) { printf("%d ", i); } int Visited[MAXN] = {0}; void DFS(MGraph Graph, Vertex V, void (*Visit)(Vertex)) { Visit(V); Visited[V] = 1; Vertex W; for(W=0; W<Graph->Nv; W++) { if(!Visited[W] && Graph->G[V][W] != INFINITY) DFS(Graph, W, Visit); } } Queue CreateQueue() { Queue Q = (Queue)malloc(sizeof(struct QNode)); Q->Start = 0; Q->End = 0; return Q; } void AddQ(Queue Q, Vertex V) { Q->Arr[Q->End++] = V; if(Q->End >= MAXSIZE) Q->End = Q->End % MAXSIZE; } Vertex DeleteQ(Queue Q) { Vertex tmp = Q->Arr[Q->Start++]; if(Q->Start >= MAXSIZE) Q->Start = Q->Start % MAXSIZE; return tmp; } int IsEmptyQ(Queue Q) { if(Q->Start == Q->End) return 1; else return 0; } void BFS(MGraph Graph, Vertex V, void (*Visit)(Vertex)) { Visit(V); Visited[V] = 1; Queue Q = CreateQueue(); AddQ(Q, V); Vertex tmpV,i; while(!IsEmptyQ(Q)) { tmpV = DeleteQ(Q); for(i=0; i<Graph->Nv; i++) { if( Graph->G[tmpV][i] != INFINITY && !Visited[i] ) { Visit(i); Visited[i] = 1; AddQ(Q, i); } } } } int main() { int N,M; scanf("%d %d", &N, &M); MGraph Graph = BuildGraph(N, M); Vertex StartPoint = 0; while(StartPoint < Graph->Nv) { if(Visited[StartPoint] == 0) { printf("{ "); DFS(Graph, StartPoint, Visit); printf("}\n"); } StartPoint++; } //clear the Visited[] for(StartPoint = 0; StartPoint<Graph->Nv; StartPoint++) Visited[StartPoint] = 0; StartPoint = 0; while(StartPoint < Graph->Nv) { if(Visited[StartPoint] == 0) { printf("{ "); BFS(Graph, StartPoint, Visit); printf("}\n"); } StartPoint++; } return 0; }
相关文章推荐
- 数据结构PTA 基础实验6-2.2 汉密尔顿回路
- PTA 2-1 列出连通集【DFS+BFS基础】
- 基础实验4-2.2 List Leaves列出叶结点 (25 分)【层次遍历】
- 列出连通集-浙大数据结构(C语言实现)
- PTA - - 06-图1 列出连通集 (25分)
- 数据结构第2章上机实验题2.1
- 帧中继point-to-point基础实验2.1
- 基础实验2-2.1-整数的分类处理-编程题
- MOOC浙大数据结构 — 06-图1 列出连通集 (25分)
- 浙大数据结构习题笔记:06-图1 列出连通集(无向图DFS与BFS)
- 基础实验6-2.6 最短工期 (25分)(C语言实现)(数据结构)
- 数据结构PTA 进阶实验6-3.4 拯救007(升级版)
- 中国大学MOOC-陈越、何钦铭-数据结构 列出连通集
- PTA_2019春_061_列出连通集
- 数据结构|创建学生成绩的顺序表(实验2.1)
- 7-3 jmu-Java-03面向对象基础-03-形状 (3 分)pta的java实验
- 基础实验3-2.1 一元多项式求导 (20 分)
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
- 2017-2018-1 20162330 实验五 数据结构综合应用
- uva679 Dropping Balls 入门经典II 第六章数据结构基础 例题6-6