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(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排中最高者站中间(中 ...
随机推荐
- Gamma函数是如何被发现的?
学过微积分的人,肯定都接触过Euler积分,按教科书上的说法,这是两种含有参变量的定积分,但其实没那么玄乎,它们只是两个函数.其中第一型Euler积分叫\(B\)-函数,第二型Euler积分叫\(\G ...
- Maven日常 —— 你应该知道的一二三
以前在日常工作中,使用Maven只是机械的执行Maven clean.Maven install,对其中的原理与过程并无了解,近期阅读了<Maven实战>,对Maven有了更深入的理解. ...
- 2013 duilib入门简明教程 -- VS环境配置(2)
既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错误,以及路径配置错误等等,还有人不知道SVN,然后一个个文件手动下载的. 其实吧,duili ...
- jquery中on/delegate的原理
jquery中on/delegate的原理 早期版本中叫delegate, 后来有过live函数,再后来统一用on.下面的方法等效: // jQuery 1.3 $(selector).(events ...
- Selenium WebDriver 3.0 需要注意的事项
以下所有代码基于Java 首先,要使用WebDriver 3.0 的话 请使用JAVA 8(必要) 其次,由于W3C标准化以及各大浏览器厂商的积极跟进,自WebDriver 3.0 之后,Sele ...
- 在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 后期博客首发:http://dnt.dkill.net/Article/Det ...
- cronolog分割Tomcat catalina.out日志
Linux上tomcat的日志输出在catalina.out里面,随着时间的推移,产生的日志文件会越来越大,其主要是调试中打印的一些信息占空间,比如说System.out和log等等.tomcat 的 ...
- 实现python中的map函数
假设Python没有提供map()函数,自行编写my_map()函数实现与map()相同的功能.以下代码在Python 2.7.8中实现. 实现代码: def my_map(fun,num): i = ...
- 前端学PHP之面向对象系列第一篇——类和对象
× 目录 [1]类 [2]成员属性[3]成员方法[4]对象[5]成员访问[6]this 前面的话 面向对象程序设计(OOP)是一种计算机编程架构.计算机程序由单个能够起到子程序作用的单元或对象组成,为 ...
- php的基础
js是前段脚本语言 php是后端脚本语言 一.所建的文件都要存在wap下的www里面 二.所有的文件名都不能包含中文 三.通过输入 localhost/www下的文件名称,可以浏览 四.在DW内新建站 ...