PTA数据结构与算法题目集(中文)  7-6

7-6 列出连通集 (25 分)
 

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v​1​​ v​2​​ ... v​k​​ }"的格式,每行输出一个连通集。先输出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 }
题目分析:考察图基本功能的实现 深度优先遍历和广度优先遍历的实现 注意因为有的点不连通 所以要遍历一边 所有图节点看是否还有未被收录的
深度优先遍历使用递归访问 广度优先遍历利用队列来进行访问
 #define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxVertexNum 100 typedef struct ENode* Edge;
struct ENode
{
int V1, V2;
};
typedef struct GNode* Graph;
struct GNode
{
int Nv;
int Ne;
int G[MaxVertexNum][MaxVertexNum];
}; Graph BuildGraph(int VertexNum)
{
Graph Gra;
Gra = (Graph)malloc(sizeof(struct GNode));
Gra->Ne = ;
Gra->Nv = VertexNum;
for (int i = ; i < VertexNum; i++)
for (int j = ; j < VertexNum; j++)
Gra->G[i][j] = ;
return Gra;
}
void InsertEdge(Edge E, Graph Gra)
{
Gra->G[E->V1][E->V2] = ;
Gra->G[E->V2][E->V1] = ;
}
Graph CreatGraph()
{
Edge E;
int N, M;
scanf("%d%d", &N, &M);
Graph G = BuildGraph(N);
G->Ne = M;
for (int i = ; i < M; i++)
{
E = (Edge)malloc(sizeof(struct ENode));
int V1, V2;
scanf("%d%d", &V1, &V2);
E->V1 = V1;
E->V2 = V2;
InsertEdge(E, G);
}
return G;
}
int IsEdge(Graph G, int V1, int V2)
{
return G->G[V1][V2] == ;
}
int Collected[MaxVertexNum];
void Initialize()
{
for (int i = ; i < MaxVertexNum; i++)
Collected[i] = ;
}
void DFS(Graph G,int i)
{
printf("%d ", i);
Collected[i] = ;
for (int j = ; j < G->Nv; j++)
{
if (!Collected[j]&&IsEdge(G,i,j))
DFS(G, j);
}
} int Queue[];
int Front = ;
int Rear = ;
int Size = ;
int Succ(int num)
{
if (num == )
return ;
else
return num;
}
void EnQueue(int num)
{
Rear = Succ(Rear + );
Queue[Rear] = num;
Size++;
}
int DeQueue()
{
int Value = Queue[Front];
Front = Succ(Front + );
Size--;
return Value;
}
int IsEmpty()
{
return Size == ;
}
void BFS(Graph G,int i)
{
EnQueue(i);
Collected[i] = ;
while (!IsEmpty())
{
int Tmp = DeQueue();
printf("%d ", Tmp);
for (int j = ; j < G->Nv; j++)
{
if (!Collected[j] && IsEdge(G, Tmp, j))
{
EnQueue(j);
Collected[j] = ;
}
}
}
}
int main()
{
Graph G=CreatGraph();
for (int i = ; i < G->Nv; i++)
{
if (!Collected[i])
{
printf("{ ");
DFS(G, i);
printf("}");
printf("\n");
}
}
Initialize();
for (int i = ; i < G->Nv; i++)
{
if (!Collected[i])
{
printf("{ ");
BFS(G, i);
printf("}");
printf("\n");
}
}
return ;
}

最新文章

  1. zorka源码解读之通过beanshell进行插桩的流程
  2. ODOO的命令行调用以及config默认值
  3. 基于C++/Lua的游戏服务器如何实现?
  4. avalon2学习教程11数据联动
  5. 户外物理渗透:终端机,客户端的web测试思路
  6. lintcode:接雨水
  7. /proc/sys/net/ipv4/ip_forward
  8. [Angular 2] Using Two Reducers Together
  9. input模糊搜索功能
  10. C++之继承和动态内存分配
  11. Winform常用开发模式第一篇
  12. 从.Net版本演变看String和StringBuild性能之争
  13. F - Capture
  14. Bootstrap3 概述
  15. Guest Editors’ Introduction: Special Issue on Advances in Management of Softwarized Networks
  16. 个人信息——头像更换(拍照或相册上传)~ 微信小程序
  17. 基于Linux环境,创建PHP后台守护进程(转载)
  18. Centos7系统详细的启动流程
  19. docker知识点
  20. bug定位

热门文章

  1. 第四篇(1):企业常用Linux web环境安装配置(apache、php、mysql)
  2. c++ 中的单例类模板的实现方法
  3. Python面向对象之:类空间问题以及类之间的关系
  4. VScode 格式化代码保存时使用ESlint修复代码
  5. 基于 HTML5 WebGL 的发动机 3D 可视化系统
  6. 异步编程RxJava-介绍
  7. Remmina
  8. Django之CBV装饰器,跨站请求伪造,auth认证
  9. vue项目创建与使用
  10. [WPF]总结一些我在开发WPF时常用的工具