数据结构与C语言实现(八)——图(上):邻接矩阵表示图

来源:互联网 发布:应用程序软件下载 编辑:程序博客网 时间:2024/04/29 16:13
/*图论图是顶点V和边E构成的1.首先我们考虑使用邻接矩阵来表示一个图。G[i][j],若<vi,vj>是G中的边,那么就为1,否则为0比如<3,0>中间有条线,那么<3,0>为1,那么显然<0,3>也为1;明显有一半是浪费。所以我们只存矩阵的上三角或者下三角。简而言之就是建立一个二维数组下标到一维数组下标的映射,具体映射如下G[N][N] ---> A[N*(N+1)/2] 三角形内元素总数量<vi,vj> ---> G[i][j] ---> A[i*(i+1)/2  + j] 前面i行元素之和+前j个元素。注意,行列数从1开始数,数组从0开始。上面对于无向图使用,<vi,vj>有边则为1,无边为0。对于网络而言——可以将<vi,vj>的数值设为权值。好处——直观,简单,好立即方便检查任意一对顶点之间是否存在边方便找任一顶点的所有邻接点(有边直接相连的顶点)方便计算任何一个顶点的度。(从该点发出的点叫出度,指向这个点的边数叫入度)——无向图:对应行/列非0元素的个数(其实就是邻接点个数)——有向图:对应行非0是出度,对应列非0是入度2.我们可以用链表来表示。*//* 邻接矩阵表示的图结构 */#include <stdio.h>#include <stdlib.h>typedef int VertexType;typedef intEdgeType;#define MAXVEX 100#define INFINITY 65535#define DEBUGtypedef struct{VertexType vexs[MAXVEX];//顶点表,用来存放顶点数目EdgeType   arc[MAXVEX][MAXVEX];//邻接矩阵,边int numVertexes, numEdges;}Graph;//在图中寻找某个顶点int Find_Vertex(Graph *g, char ch){int i = 0;for (i = 0; i < g->numVertexes; i++){if (g->vexs[i] == ch)break;}return i;}void CreateGraph(Graph* G){printf("请输入顶点和边数:\n");scanf("%d %d", &G->numVertexes, &G->numEdges);//#ifdef DEBUG//printf("%d %d\n", G->numVertexes, G->numEdges);//#endif // DEBUGprintf("请输入顶点值:\n");for (int i = 0; i < G->numVertexes; i++){scanf("%d", &G->vexs[i]);}//有向网络逆向值为无穷,正向值为权值,自己到自己为0//无向网络不连接为0,有连接为权值for (int i = 0; i < G->numVertexes; i++){for (int j = 0; j < G->numVertexes; j++)G->arc[i][j] = 0;}printf("输入<vi,vj>的两个顶点标号,和权值.\n按Q表示退出\n");while (getchar() != 'q'){int m, n, w;scanf("%d %d %d", &m, &n, &w);G->arc[m][n] = w;G->arc[n][m] = w;}}void Print_Graph(Graph *G){for (int i = 0; i < G->numVertexes; i++){for (int j = 0; j < G->numVertexes; j++){printf("%d ", G->arc[i][j]);}putchar('\n');}}int main(){Graph New_Graph;Graph *G = &New_Graph;CreateGraph(G);Print_Graph(G);return 0;}

阅读全文
0 0
原创粉丝点击