图的概念与实现

图是由顶点的有穷非空集合和顶点之间边的集合组成,所以,图不允许没有顶点。可以有空表,空树,但是没有空图。

图分有向图和无向图。无向图油顶点和边构成,有向图油顶点和狐构成。弧有弧头和弧尾。

图按照边或弧的多少分希疏图和稠密图。如果任意两个顶点之间都存在边叫完全图,有向的叫有向完全图。若无重复的边或顶点到自身的边则叫简单图。

无向图顶点的边数叫度,有向图顶点分为入度和出度。图上的边或弧带权叫网。

图中顶点间存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起始点则称为环,当中不重复叫简单路径。若任意两点间都是连通的,则图就是连通图,有向则称为强连通图。图中有子图,若子图极大连通则就是连通分量,有向的则称强连通分量。

无向图中连通且n个顶点n-1条边叫生成树。有向图中一顶点入读为0其余顶点入度为1的叫有向树。一个有向图由若干棵有向树构成生成森林。

  1 /*图的实现*/
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <time.h>
  5 #include "Queue.h"
  6
  7 #define OK 1
  8 #define ERROR 0
  9 typedef int Status;
 10
 11 typedef char VertexType;
 12 typedef int EdgeType;
 13 #define MAXVEX 100
 14 #define INFINITY 65535
 15
 16 /*邻接矩阵*/
 17 typedef struct
 18 {
 19     VertexType vex[MAXVEX];
 20     EdgeType arc[MAXVEX][MAXVEX];
 21     int numVertexes, numEdges;
 22 }MGraph;
 23
 24 void CreateMGraph(MGraph *G)
 25 {
 26     int i, j, k, w;
 27     char tmp;
 28     tmp = getchar();
 29     printf("Input ver and edg :");
 30     scanf("%d %d", &G->numVertexes, &G->numEdges);
 31     tmp = getchar();
 32     for (i = 0; i < G->numVertexes; i++)
 33     {
 34         printf("Input vertex :");
 35         //scanf(&G->vex[i]);
 36         char s = getchar();
 37         G->vex[i] = s;
 38         tmp = getchar();
 39     }
 40     for(i=0;i<G->numEdges;i++)
 41         for (j = 0; j < G->numEdges; j++)
 42         {
 43             G->arc[i][j] = INFINITY;
 44         }
 45     for (k = 0; k < G->numEdges; k++)
 46     {
 47         printf("Input ver1 and ver2 and w:");
 48         scanf("%d %d %d", &i, &j, &w);
 49         tmp = getchar();
 50         G->arc[i][j] = w;
 51         G->arc[j][i] = G->arc[i][j];
 52     }
 53 }
 54 /*邻接表*/
 55 typedef struct EdgeNode
 56 {
 57     int adjvex;
 58     EdgeType weight;
 59     struct EdgeNode * next;
 60 }EdgeNode;
 61 typedef struct VertexNode
 62 {
 63     VertexType data;
 64     EdgeNode *firstedge;
 65 }VertexNode, AdjList[MAXVEX];
 66 typedef struct
 67 {
 68     AdjList adjList;
 69     int numVertexes, numEdges;
 70 }GraphAdjList;
 71 void CreateALGraph(GraphAdjList *G)
 72 {
 73     int i, j, k;
 74     EdgeNode *e;
 75     char tmp;
 76     printf("Input ver and edg :");
 77     scanf("%d %d", &G->numVertexes, &G->numEdges);
 78     tmp = getchar();
 79     for (i = 0; i < G->numVertexes; i++)
 80     {
 81         printf("Input vertex :");
 82         //scanf("%c",&G->adjList[i].data);
 83         char s;
 84         s = getchar();
 85         tmp = getchar();
 86         G->adjList[i].data = s;
 87         G->adjList[i].firstedge = NULL;
 88     }
 89     for (k = 0; k < G->numEdges; k++)
 90     {
 91         printf("Input ver1 and ver2:");
 92         scanf("%d %d", &i, &j);
 93         tmp = getchar();
 94         e = (EdgeNode*)malloc(sizeof(EdgeNode));
 95         e->adjvex = j;
 96
 97         e->next = G->adjList[i].firstedge;
 98         G->adjList[i].firstedge = e;
 99         e = (EdgeNode*)malloc(sizeof(EdgeNode));
100         e->adjvex = i;
101         e->next = G->adjList[j].firstedge;
102         G->adjList[j].firstedge = e;
103     }
104 }
105 /*邻接矩阵的深度优先遍历*/
106 typedef int Boolean;
107 Boolean visited[MAXVEX];
108 void DFSM(MGraph G, int i)
109 {
110     int j;
111     visited[i] = true;
112     printf("%c ", G.vex[i]);
113     for (j = 0; j < G.numVertexes; j++)
114     {
115         if (G.arc[i][j] == 1 && !visited[j])
116             DFSM(G, j);
117     }
118 }
119 void DFSMTraverse(MGraph G)
120 {
121     int i;
122     for (i = 0; i < G.numVertexes; i++)
123         visited[i] = false;
124     for (i = 0; i < G.numVertexes; i++)
125         if (!visited[i])
126             DFSM(G, i);
127 }
128 /*邻接表的深度优先遍历,递归算法*/
129 void DFSAL(GraphAdjList G, int i)
130 {
131     EdgeNode* p;
132     visited[i] = true;
133     printf("%c ", G.adjList[i].data);
134     p = G.adjList[i].firstedge;
135     while (p)
136     {
137         if (!visited[p->adjvex])
138             DFSAL(G, p->adjvex);
139         p = p->next;
140     }
141 }
142 void DFSALTraverse(GraphAdjList G)
143 {
144     int i;
145     for (i = 0; i < G.numVertexes; i++)
146         visited[i] = false;
147     for (i = 0; i < G.numVertexes; i++)
148         if (!visited[i])
149             DFSAL(G, i);
150 }
151 /*邻接矩阵的广度优先遍历*/
152 void BFSMTraverse(MGraph G)
153 {
154     int i, j;
155     SqQueue Q;
156     for (i = 0; i < G.numVertexes; i++)
157         visited[i] = false;
158     InitQueue(&Q);
159     for (i = 0; i < G.numVertexes; i++)
160     {
161         if (!visited[i])
162         {
163             visited[i] = true;
164             printf("%c ", G.vex[i]);
165             EnQueue(&Q, i);
166             while(!QueueEmpty(Q))
167             {
168                 DeQueue(&Q, &i);
169                 for (j = 0; j < G.numVertexes; j++)
170                 {
171                     if (G.arc[i][j] == 1 && !visited[j])
172                     {
173                         visited[j] = true;
174                         printf("%c ", G.vex[j]);
175                         EnQueue(&Q, j);
176                     }
177                 }
178             }
179         }
180     }
181 }
182 /*邻接表的广度优先遍历*/
183 void BFSALTraverse(GraphAdjList G)
184 {
185     int i;
186     EdgeNode *p;
187     SqQueue Q;
188     for (i = 0; i < G.numVertexes; i++)
189         visited[i] = false;
190     InitQueue(&Q);
191     for (i = 0; i < G.numVertexes; i++)
192     {
193         if (!visited[i])
194         {
195             visited[i] = true;
196             printf("%c ", G.adjList[i].data);
197             EnQueue(&Q, i);
198             while (!QueueEmpty(Q))
199             {
200                 DeQueue(&Q, &i);
201                 p = G.adjList[i].firstedge;
202                 while(p)
203                 {
204                     if (!visited[p->adjvex])
205                     {
206                         visited[p->adjvex] = true;
207                         printf("%c ", G.adjList[p->adjvex].data);
208                         EnQueue(&Q, p->adjvex);
209                     }
210                     p = p->next;
211                 }
212             }
213         }
214     }
215 }
216 int main()
217 {
218     MGraph T;
219     GraphAdjList G;
220     char opp = ‘-1‘;
221
222     printf("\n1.创建邻接矩阵图 \n2.创建邻接表图  \n3.深度遍历邻接矩阵 \n4.深度遍历邻接表 \n5 广度遍历邻接矩阵 \n6 广度遍历邻接表 \n0 退出 \n请选择你的操作:\n");
223
224     while (opp != ‘0‘) {
225         opp = getchar();
226         switch (opp) {
227         case ‘1‘:
228             CreateMGraph(&T);
229             printf("create finish!\n");
230             break;
231         case ‘2‘:
232             CreateALGraph(&G);
233             printf("create finish!\n");
234             break;
235         case ‘3‘:
236             DFSMTraverse(T);
237             printf("\n");
238             break;
239         case ‘4‘:
240             DFSALTraverse(G);
241             printf("\n");
242             break;
243         case ‘5‘:
244             BFSMTraverse(T);
245             printf("\n");
246             break;
247         case ‘6‘:
248             BFSALTraverse(G);
249             printf("\n");
250             break;
251         case ‘0‘:
252             exit(0);
253         }
254     }
255 }
时间: 2024-11-08 05:15:27

图的概念与实现的相关文章

37. 蛤蟆的数据结构笔记之三十七图的概念

37. 蛤蟆的数据结构笔记之三十七图的概念 本篇名言:"宿命论是那些缺乏意志力的弱者的借口.--罗曼? 罗兰" 又到了一个新概念,这次咱们来看 这个图,图一看给人一种凌乱的感觉.那么它在数据结构中又是什么呢? 欢迎转载,转载请标明出处: 1.  图的概念 图(graph)是一种比线性表.树更为复杂的数据结构.在线性表中,数据元素之间呈线性关系,即每个元素只有一个直接前驱和一个直接后继.在树型结构中,数据元素之间有明显的的层次关系,即每个结点只有一个直接前驱,但可有多个直接后继,而在图结

数据结构-图的概念

根据我做过的一些错题.我想要简要总结一下一些比较容易忽略的图的概念. 1完全有向图和完全无向图. 一个有向图,有n个结点,则最多有n(n-1)条边.这种有n(n-1)条边的有向图是完全有向图. 一个无向图有n个节点,则最多有n(n-1)/2条边.这种n(n-1)/2条边的无向图是完全无向图. 2连通,连通图,连通分量. 在无向图中,vi到vj有路径,则说vi到vj连通. 若无向图的任意两个节点都连通,说这是连通图. 连通分量,在理解它之前,先要理解什么事极大连通子图. A B是连通子图  A C

图的概念、存储及遍历

图的概念.存储及遍历 图是一种特殊的数据结构,由点和边构成,它可以用来描述元素之间的网状关系,这个网状没有顺序,也没有层次,就是简单的把各个元素连接起来.图在我们的生活中也十分常见,地图就是最简单的例子. 图的基本概念: 顶点集合为V,边集合为E的图记作G=(V,E).另外,G=(V,E)的顶点数和边数分别为|V|和|E|.对于两个图G和G',如果G'的顶点集合与边集合均为G的顶点集合与边集合的子集,那么称G'是G的子图.子图实际上就是一张图里面小一点的图,也可以是点,不难理解. 有向图:图的边

图论:图的概念与图的储存方式

转载自http://acm.uestc.edu.cn/bbs/read.php?tid=5670 下载ppt帐号:qscqesze 密码:123456 ------------------------------------------------------------------- 1.图的基本概念 图:二元组(V, E) .V 为顶点集.E为V 中结点之间的边的集合. 自环:一条边的两个端点是相同的. 多重边:两个端点之间有两条以上的边,称他们是多重边. 简单图:没有自环和多重边的图 无向

第一节 图的概念

import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL']='2' # 修改TensorFlow警告信息级别 # 创建一张图包含了op和tensor,使用图是在上下文环境中的 # op:只要用TensorFlow的API定义的函数都是op # tensor:就是指代数据 g = tf.Graph() print(g) # 使用图 with g.as_default(): c = tf.constant(11.0) pr

浙江大学软件学院三维动画与交互技术考试概念整理

第一讲 1.    增强现实技术AR: --融合了三维动画.立体视觉和图像处理: --建模.渲染.位置标定.图像融合: 2.    OpenGL是一种用于创建实时3D图像的编程接口. 3.    三维这个术语表示一个正在描述或显示的物体具有三维维度:宽度.高度.深度: --计算机3D图形实质上也是平面的: --在计算机屏幕上显示的二维图像,提供深度(或第三维)的错觉: 2D+透视 = 3D 透视使人产生深度的错觉. 4.    真正的3D是通过人的两只眼睛观察同一个物体,在视网膜上生成具有视差的

UML状态图和活动图

UML状态图和活动图 统一建模语言UML(Unified Modeling Language)是非专利的第三代建模和规约语言.UML是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法.UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效. UML定义了5类,10种模型图: 1.用例图:从用户角度描述系统功能,并指各功能的操作者.2.静态图:包括类图,包图,对象图.   类图:描述系统中

各种图(流程图,思维导图,UML,拓扑图,ER图)简介

来源于:http://www.cnblogs.com/jiqing9006/p/3344221.html 流程图 1.定义:流程图是对过程.算法.流程的一种图像表示,在技术设计.交流及商业简报等领域有广泛的应用. 2.案例 3.计算机语言只是一种工具.光学习语言的规则还不够,最重要的是学会针对各种类型的问题,拟定出有效的解决方法和步骤即算法.有了正确而有效的算法,可以利用任何一种计算机高级语言编写程序,使计算机进行工作.因此,设计算法是程序设计的核心. 对同一个问题,可以有不同的解题方法和步骤.

思维导图分享以及MindManager使用说明

来源于: http://www.cnblogs.com/muhongxing/archive/2009/12/22/1628782.html http://www.cnblogs.com/muhongxing/archive/2009/12/29/1635104.html 我使用思维导图已经有一段时间了,也有了一些自己的经验,甚至,在工作和生活中,思维导图已经是我必不可少的一项工具.当智哥问我能不能用一句话解释清楚思维导图的时候,我迟疑了一下,还是没法说清楚(看来要将<金字塔原理>列入读书计划