06-图1 列出连通集 (25分)(C语言邻接表实现)
题目地址:https://pta.patest.cn/pta/test/558/exam/4/question/9495
由于边数E<(n*(n-1))/2 所以我选用了邻接表实现,优先队列用循环队列实现;
DFS基本思路:
1:选择一个点,标志已经访问过;
2:判断这个点的其他邻接点(访问顺序按题目是从小到大)是否访问过,来选择下一个点;
3:重复第2点直到全部点已经访问过。
伪代码如下
DFS( Vertex v )
{
Visit( V );
Visited[V] = true;
foreach( v->neighbor )
if ( Visited[v->neighbor ] == false )
DFS(v->neighbor );
}
BFS基本思路:
1:选择一个点入队,并访问这个点,标志已经访问过;
2:出队,将这个点未访问过的全部邻点访问并入队;
3:重复第二点直到队列为空;
伪代码如下
BFS ( Vertex v )
{
Visit( v );
Visited[v] = true;
EnQueue(Q, v);
while ( !IsEmpty(Q) )
{
w = DeQueue(Q);
foreach ( w->neighor )
if ( Visited[w->neighor] == false )
{
Visit( w->neighor );
Visited[w->neighor] = true;
EnQueue(Q, w->neighor);
}
}
}
具体代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <dos.h>
#define MaxVertexNum 10
typedef int ElementType;
typedef int Position;
typedef struct QNode {
ElementType *Data; /* 存储元素的数组 */
Position Front, Rear; /* 队列的头、尾指针 */
int MaxSize; /* 队列最大容量 */
}QNode, *Queue;
typedef struct ENode
{
int ivex; //该边指向的顶点位置
struct ENode * next;
}ENode, *PENode;
typedef int VertexType;
typedef struct VNode
{
VertexType data;
ENode * first_edge;
}VNode;
typedef struct LGraph
{
int vexnum; //图的顶点数目
int edgnum; //图的边的数目
VNode * vexs; //存放顶点的数组
}LGraph;
bool TAG; //用于输出格式
bool visited[MaxVertexNum];
LGraph * LGraph_new();
void LGraph_destroy(LGraph * G);
void LGraph_insert(ENode ** head, int ivex);
void ResetVisit();
void DFS(LGraph * G, int vex);
void BFS(LGraph * G, int vex);
void ListComponents(LGraph * G, void (*func)(LGraph * G, int vex));
//优先队列的基本操作
Queue CreateQueue( int MaxSize );
bool IsFull( Queue Q );
bool AddQ( Queue Q, ElementType X );
bool IsEmpty( Queue Q );
ElementType DeleteQ( Queue Q );
int main()
{
LGraph * G = LGraph_new();
ResetVisit();
ListComponents(G, DFS);
ResetVisit();
ListComponents(G, BFS);
system("pause");
;
}
void ListComponents(LGraph * G, void (*func)(LGraph * G, int vex))
{
int i;
; i < G->vexnum; ++i )
{
if (visited[i] == false)
{
(*func)(G, i);
printf("}\n");
TAG = false;
}
}
}
LGraph * LGraph_new()
{
LGraph * G = (LGraph *)malloc(sizeof(LGraph));
scanf("%d %d", &G->vexnum, &G->edgnum);
G->vexs = (VNode *)malloc(G->vexnum * sizeof(VNode));
int i, v1, v2;
; i < G->vexnum; ++i )
{
G->vexs[i].data = i;
G->vexs[i].first_edge = NULL;
}
; i < G->edgnum; ++i )
{
scanf("%d %d", &v1, &v2);
//由于顶点信息就是顶点坐标
LGraph_insert(&G->vexs[v1].first_edge, v2);
LGraph_insert(&G->vexs[v2].first_edge, v1);
}
return G;
}
void ResetVisit()
{
TAG = false;
memset(visited, false, sizeof(visited));
}
void LGraph_insert(ENode ** head, int ivex)
{
ENode *pnew, *p1, *p2;
pnew = (ENode *)malloc(sizeof(ENode));
pnew->ivex = ivex;
if ( *head == NULL )
{
*head = pnew;
pnew->next = NULL;
}
else
{
if ( (*head)->ivex > ivex ) //没头结点的麻烦
{
pnew->next = *head;
*head = pnew;
}
else
{
for (p1 = *head, p2 = p1->next; p2 != NULL ; p1 = p2, p2 = p1->next )
{
if ( p2->ivex > ivex )
break;
}
pnew->next = p2;
p1->next = pnew;
}
}
}
void DFS(LGraph * G, int vex)
{
if (TAG == false)
{
TAG = true;
printf("{ ");
}
printf("%d ", vex);
visited[vex] = true;
ENode * temp = G->vexs[vex].first_edge;
while( temp != NULL )
{
if (visited[temp->ivex] == false)
{
DFS(G, temp->ivex);
}
temp = temp->next;
}
}
void BFS(LGraph * G, int vex)
{
Queue Q = CreateQueue(G->vexnum);
if (TAG == false)
{
TAG = true;
printf("{ ");
}
printf("%d ", vex);
visited[vex] = true;
AddQ(Q, vex);
while (!IsEmpty(Q))
{
vex = DeleteQ(Q);
ENode * temp = G->vexs[vex].first_edge;
while (temp != NULL)
{
if ( visited[temp->ivex] == false )
{
printf("%d ",temp->ivex);
visited[temp->ivex] = true;
AddQ(Q, temp->ivex);
}
temp = temp->next;
}
}
free(Q->Data);
free(Q);
}
//队列基本操作
Queue CreateQueue( int MaxSize )
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
Q->Front = Q->Rear = ;
Q->MaxSize = MaxSize;
return Q;
}
bool IsFull( Queue Q )
{
)%Q->MaxSize == Q->Front);
}
bool AddQ( Queue Q, ElementType X )
{
if ( IsFull(Q) ) {
printf("队列满");
return false;
}
else {
Q->Rear = (Q->Rear+)%Q->MaxSize;
Q->Data[Q->Rear] = X;
return true;
}
}
bool IsEmpty( Queue Q )
{
return (Q->Front == Q->Rear);
}
ElementType DeleteQ( Queue Q )
{
if ( IsEmpty(Q) ) {
printf("队列空");
;
}
else {
Q->Front =(Q->Front+)%Q->MaxSize;
return Q->Data[Q->Front];
}
}
06-图1 列出连通集 (25分)(C语言邻接表实现)的更多相关文章
- PTA - - 06-图1 列出连通集 (25分)
06-图1 列出连通集 (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...
- 图论——图的邻接表实现——Java语言(完整demo)
1.图的简单实现方法——邻接矩阵 表示图的一种简单的方法是使用一个一维数组和一个二维数组,称为领接矩阵(adjacent matrix)表示法. 对于每条边(u,v),置A[u,v]等于true:否则 ...
- 【(图) 旅游规划 (25 分)】【Dijkstra算法】
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> us ...
- 1090 危险品装箱 (25分)C语言
集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否 ...
- 1050 螺旋矩阵 (25 分)C语言
本题要求将给定的 N 个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 ...
- 1065 单身狗 (25分)C语言
单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数:随 ...
- 1060 爱丁顿数 (25 分)C语言
英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个"爱丁顿数" E ,即满足有 E 天骑车超过 E 英里的最大整数 E.据说爱丁顿自己的 E 等于87. 现给 ...
- 1025 反转链表 (25 分)C语言
题目描述 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为 3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5 ...
- 1055 集体照 (25 分)C语言
拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中 ...
随机推荐
- MVC缓存
MVC入门系列教程-视频版本,已入驻51CTO学院,文本+视频学效果更好哦.视频链接地址如下: 点我查看视频.另外,针对该系列教程博主提供有偿技术支持,群号:226090960,群内会针对该教程的问题 ...
- TODO:小程序手机预览调试
TODO:小程序手机预览调试 1. 小程序注册,目前还未开通个人注册,主体类型为企业.政府.媒体.其他组织 2. 登录小程序,绑定开发者,获取AppID 3. 下载微信小程序示例-新片预告 https ...
- Red Gate(SQLToolbelt)SQL Server的安装与注册(破解)
Red Gate(SQLToolbelt)是SQL Server辅佐工具 1.SQL Compare 比较和同步SQL Server数据库结构 2.SQL Data Compare 比较和同步SQL ...
- Apk去掉签名以及重新签名的方法
Android开发中很重要的一部就是用自己的密钥给Apk文件签名,不经过签名的Apk文件一般是无法安装的,就算装了最后也是失败. 网上流传的"勾选允许安装未知来源的应用"其实跟签不 ...
- Spire.DOC生成表格测试
首先,很感谢Jack对我的信任,让我来写一个评测,在此对Jack说一声抱歉,由于本人愚钝,并且最近项目比较紧张,把评测这个事情脱了一个月之久,由于往后的日子可能更忙,所以今晚抽空只能只写了一个小程序来 ...
- 深入学习jQuery选择器系列第五篇——过滤选择器之内容选择器
× 目录 [1]contains [2]empty [3]parent[4]has[5]not[6]header[7]lang[8]root 前面的话 本文介绍过滤选择器中的内容选择器.内容选择器的过 ...
- 基于X86平台的PC机通过网络发送一个int(32位)整数的字节顺序
1.字节顺序 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序是高字节数据存 ...
- java的栈图形演示
import java.awt.*; import javax.swing.*; import java.awt.event.*; /* 指示发生了组件定义的动作的语义事件.当特定于组件的动作(比如被 ...
- Binary XML file line #2: Error inflating
06-27 14:29:27.600: E/AndroidRuntime(6936): FATAL EXCEPTION: main 06-27 14:29:27.600: E/AndroidRunti ...
- JavaScript:声明变量名的语法规则
一.语法规则 1.变量必须使用字母.下划线(_)或者美元符($)开始. 2.然后可以使用任意多个英文字母.数字.下划线(_)或者美元符($)组成. 3.不能使用JS关键词与保留字. 二.示例 var ...