C语言实现图的邻接矩阵和BFS DFS
来源:互联网 发布:广东环保网络问政平台 编辑:程序博客网 时间:2024/05/18 03:12
我没有写思路,学到这里连着都看不懂的话,还是不要学的好#include <stdio.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语言实现图的邻接矩阵和BFS DFS
- 复习(数据结构):图:c语言:邻接矩阵DFS和BFS
- [数据结构]图基于邻接矩阵的BFS与DFS的C语言简单实现
- 图的邻接矩阵表示 DFS 和BFS C++实现
- 有向图的DFS和BFS(邻接矩阵实现)
- 邻接矩阵图的dfs和bfs
- 图的遍历(DFS、BFS)使用邻接矩阵(数组)作为存储结构--C语言
- 邻接矩阵实现图的存储,DFS,BFS遍历
- java版 图的邻接表、邻接矩阵、BFS、DFS 实现
- 图的遍历(BFS、DFS的邻接矩阵和邻接表实现)
- 图的BFS和DFS在数据结构为邻接矩阵时的实现
- 邻接矩阵实现--图的深度优先遍历DFS和广度优先遍历BFS
- 邻接矩阵的DFS 和 BFS 搜索遍历
- 图的邻接矩阵表示(DFS,BFS)
- 基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS
- 图的邻接矩阵(C语言实现)
- 图的广度优先搜索(BFS)、深度优先搜索(DFS)(邻接矩阵法和邻接表法java实现)
- 数据结构 邻接矩阵的BFS DFS
- 【LoadRunner】Web(HTTP/HTML)协议的关联
- 快学Scala第18章----高级类型
- 安卓中文组
- Java-1.5新特性之注解
- Codeforces Round #324 (Div. 2)C. Marina and Vasya
- C语言实现图的邻接矩阵和BFS DFS
- 搭建Spring MVC+ jdbcTemplate框架
- NetRouter之物联网篇
- 如何让程序自身防病毒
- 九度OJ的使用
- vs2012远程调试C#
- 第一章 界面的介绍
- ajax(二)——传值解析
- VC++ 系统服务如何让服务进程结束后依赖windows自身把服务重启