06-图1 列出连通集
来源:互联网 发布:国学经典软件下载 编辑:程序博客网 时间:2024/05/21 22:46
/*=====================================================================================# COPYRIGHT NOTICE# Copyright (c) 2016## @Author :Zehao Wang# @Email :zehaowang@163.com# @from :https://pta.patest.cn/pta/test/1342/exam/4/question/22500# @Last modified :2016-12-07# @Description :06-图1 列出连通集 ========================================================================================*/#include<stdio.h>#include<stdlib.h>#define MaxVertexNum 10int Visited[MaxVertexNum];typedef struct { int Vertices[MaxVertexNum];//顶点表 int Edges[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表 int n, e;//顶点数和边数}MGraph;typedef struct QNode { int Data[MaxVertexNum]; int front; int rear;}QNode,*Queue;void Reset_Visited();int Check_Visited(MGraph*G);Queue Creat_Queue();void Add_Queue(Queue Q,int item);int Delete_Queue(Queue Q);//int IsEmpty_Queue(Queue Q);void Creat_MGraph(MGraph*G);void DFS(MGraph*G, int i);void BFS(MGraph*G);int FirstAdjV(MGraph*G, int V);int NextAdjV(MGraph*G, int V, int W);Queue Creat_Queue(){ Queue Q =(Queue) malloc(sizeof(struct QNode)); Q->front = -1; Q->rear = -1; return Q;}void Add_Queue(Queue Q,int item){ if ((Q->rear + 1) % MaxVertexNum == Q->front) { printf("队列满"); return; } else { Q->rear = (Q->rear + 1) % MaxVertexNum; Q->Data[Q->rear] = item; }}int Delete_Queue(Queue Q){ if (Q->rear == Q->front) { printf("队列空"); return -1; } else { Q->front = (Q->front + 1) % MaxVertexNum; return Q->Data[Q->front]; }}int Check_Visited(MGraph *G)//看看是否还存在未被点亮的节点{ for (int i = 0; i < G->n; i++) { if (!Visited[i]) return 1; } return 0;}void Reset_Visited(){ for (int i = 0; i < MaxVertexNum; i++) Visited[i] = 0;}void Creat_MGraph(MGraph *G){ scanf("%d %d", &(G->n), &(G->e)); for (int i = 0; i < G->n; i++) { for (int j = 0; j < G->n; j++) { G->Edges[i][j] = 0; } } int a; int b; for (int k = 0; k < G->e; k++) { scanf("%d %d", &a, &b); G->Edges[a][b] = 1; G->Edges[b][a] = 1; }}void DFS(MGraph *G, int i){ Visited[i] = 1; printf("%d", i); for (int j = 0; j < G->n; j++) { if (G->Edges[i][j] == 1 && Visited[j] == 0) DFS(G, j); }}void BFS(MGraph *G){ int V; int W; Queue Q = Creat_Queue(); for (int i = 0; i < G->n; i++) { if (!Visited[i]) { printf("{"); Visited[i] = 1; printf("%d", i); Add_Queue(Q, i); while (Q->front != Q->rear)//当队列不空 { V = Delete_Queue(Q); for (W = FirstAdjV(G, V); W < G->n; W = NextAdjV(G, V, W)) { if (!Visited[W]) { Visited[W] = 1; printf("%d", W); Add_Queue(Q, W); } else break; } } printf("}"); if (Check_Visited(G)) printf("\n"); } }}int FirstAdjV(MGraph *G, int V)//和节点V相邻的第一个节点{ for (int i = 0; i < G->n; i++) { if (G->Edges[V][i] == 1 && Visited[i] == 0) return i; }}int NextAdjV(MGraph *G, int V, int W)//和节点V相邻的第二个节点(第一个节点为W){ for (int i = W; i < G->n; i++) { if (G->Edges[V][i] == 1 && Visited[i] == 0) return i; }}int main(void){ MGraph *G; G = (MGraph*)malloc(sizeof(MGraph)); for (int i = 0; i < MaxVertexNum; i++) { Visited[i] = 0; } Creat_MGraph(G); for (int j = 0; j < G->n; j++) { if (Visited[j] == 0) { printf("{"); DFS(G, j); printf("}\n"); } } Reset_Visited(); BFS(G); return 0;}/*============================================================================================注:这道题考察了图的一些基本操作,包括图的建立以及图的DFS和BFS的实现。图的建立又分两种情况,第一种为图的邻接矩阵表示,适合稠密的图,本题用的就是这种表示方法。第二种为图的邻接表表示。图的遍历有两种情况,第一种为深度优先遍历(DFS),它的遍历方式类似于树的先序遍历,用递归实现。第二为广度优先遍历(BFS),它的遍历方式类似于树的层序遍历,用队列来实现。==============================================================================================*/
0 0
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1-列出连通集
- 06-图1 列出连通集
- PTA 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- 06-图1 列出连通集 (25分)
- Coding_Algorithms(剑指Offer系列)
- C#各种结束进程的方法详细介绍
- php基础一
- 1007. 素数对猜想 (20)
- 和各种诡异 Bug 打交道 13 年,我总结了 18 个经验
- 06-图1 列出连通集
- 查询字符串中字母和数字的个数
- Redis 安装
- PAT 1010. Radix (25)
- osgearth编译总结
- Hbase 的bulkLoading机制
- Hibernate第四阶段
- 静心
- webuploader图片组建的使用