图的存储和遍历
来源:互联网 发布:营销qq加好友软件 编辑:程序博客网 时间:2024/05/21 11:37
/* Copyright: 安徽大学计算机科学与技术学院 Author: 软件工程 杨磊 Description: 图的存储和遍历*/ #include <bits/stdc++.h>#define MaxVex 100 //最大顶点数#define INFINITY 65535 //表示∞#define TRUE 1#define FALSE 0typedef char VertexType; //顶点类型typedef int EdgeType; //权值类型typedef int Bool;Bool visited[MaxVex];typedef struct { VertexType vexs[MaxVex]; //顶点数组 EdgeType arc[MaxVex][MaxVex]; //邻接矩阵 int numVertexes, numEdges; //当前图中的结点数以及边数}MGraph;//广度优先遍历需要的循环队列typedef struct { int data[MaxVex]; int front, rear;}Queue;//队列的相关操作//初始化void InitQueue(Queue *Q){ Q->front = Q->rear = 0;}//入队void EnQueue(Queue *Q, int e){ if ((Q->rear+1)%MaxVex == Q->front) return ; Q->data[Q->rear] = e; Q->rear = (Q->rear+1)%MaxVex;}//判空Bool QueueEmpty(Queue *Q){ if (Q->front == Q->rear) return TRUE; else return FALSE;}//出队void DeQueue(Queue *Q, int *e){ if (Q->front == Q->rear) return ; *e = Q->data[Q->front]; Q->front = (Q->front+1)%MaxVex;}//建立图的邻接矩阵void CreateMGraph(MGraph *G){ int i, j, k, w; printf("输入顶点数和边数: "); scanf("%d%d", &G->numVertexes,&G->numEdges); fflush(stdin); printf("==============================\n"); printf("输入各个顶点:\n"); for (i=0; i<G->numVertexes; ++i) { printf("顶点%d: ",i+1); scanf("%c", &G->vexs[i]); fflush(stdin); } for (i=0; i<G->numVertexes; ++i){ for (j=0; j<G->numVertexes; ++j) G->arc[i][j] = INFINITY; } printf("==============================\n"); for (k=0; k<G->numEdges; ++k) { printf("输入边(vi, vj)中的下标i和j和权W: "); scanf("%d%d%d", &i,&j,&w); G->arc[i][j] = w; G->arc[j][i] = G->arc[i][j]; }}//输出void DisMGraph(MGraph *G){ int i, j, k; k = G->numVertexes; for (i=0; i<k; ++i){ for (j=0; j<k; ++j){ printf("%5d ", G->arc[i][j]); } putchar('\n'); }}//图的深度优先遍历void DFS(MGraph G, int i){ int j; visited[i] = TRUE; printf("%c ", G.vexs[i]); for (j=0; j<G.numVertexes; ++j){ if (G.arc[i][j]!=INFINITY && !visited[j]) DFS(G, j); }}void DFSTraverse(MGraph G){ int i; for (i=0; i<G.numVertexes; ++i) visited[i] = FALSE; for (i=0; i<G.numVertexes; ++i){ if (!visited[i]) DFS(G, i); }}//图的广度优先遍历void BFSTraverse(MGraph *G){ int i, j; Queue Q; for (i=0; i<G->numVertexes; ++i) visited[i] = FALSE; InitQueue(&Q); for (i=0; i<G->numVertexes; ++i) { if (!visited[i]) { visited[i] = TRUE; printf("%c ", G->vexs[i]); EnQueue(&Q, i); while (!QueueEmpty(&Q)){ DeQueue(&Q, &i); for (j=0; j<G->numVertexes; ++j){ if (!visited[j] && G->arc[i][j]!=INFINITY){ visited[j] = TRUE; printf("%c ", G->vexs[j]); EnQueue(&Q, j); } } } } }}int main(){ MGraph G; CreateMGraph(&G); printf("\n图的深度优先遍历为: "); DFSTraverse(G); printf("\n图的广度优先遍历为: "); BFSTraverse(&G); printf("\n"); return 0;}
阅读全文
0 0
- 图的存储和遍历
- 图的存储和遍历
- 图的存储和遍历
- 【数据结构】图的存储和遍历
- 图的存储方式和遍历
- 图的存储和遍历C++实现
- 图的总括之存储和遍历
- 图的概念 存储结构和遍历
- 图的概念 存储结构和遍历
- 图的存储及遍历 深度遍历和广度遍历 C++代码实现
- 图的存储及遍历 深度遍历和广度遍历 C++代码实现
- 【图】图的邻接矩阵存储和广度、深度优先遍历
- 【图】图的邻接表存储和广度优先遍历
- 数据结构之图:图的存储结构和遍历
- 数据结构之 图的存储结构和遍历方式
- 数据结构——图的遍历和存储
- 图的存储、遍历和求最小生成树
- 图的存储结构(存储、遍历)
- Hbase和Hive的区别与联系
- 在ListView的后面添加View
- android一些新东西学习博客
- textview的属性总结
- CF 808E. Selling Souvenirs
- 图的存储和遍历
- tensorflow git 包含多种算法模型的实现
- 1174: 图书馆占位
- php封装sql类
- list,tuple,dict,set
- Faster-rcnn总结
- Unity----VR摄像机(浅谈)
- 关于servlet返回的几个问题
- Javascript基础