一:图的基本概念和术语
1.图之间的关系可以是任意的,任意两个数据元素之间都可能相关。
2.顶点:数据元素。
3.边or弧:从一个顶点到另一个顶点的路径。<V, W>表示弧,(V,W)表示边,V是弧尾,W是弧头,此时为有向图,否则为无向图。
4.对于无向图,边的取值范围是0到1/2*n*(n-1)。有1/2*n*(n-1)条边的无向图为完全图。对于有向图,边的取值范围0到n*(n-1),n*(n-1)称做有向完全图。
5.多条边的是稠密图,少边的是稀疏图。
6.对于无向图,顶点V的度是相连的边数;顶点V的入度是以V为头的弧数,出度是以V为尾的弧数。
7.连通图:对于图中任意顶点都能连通。
8.最小生成树:极小连通子图。
二:图的存储结构
常见的图的存储结构分为:邻接表、邻接多重表、十字链表。
能方便使用的是邻接表,下面是其代码实现:
在邻接表中对图中的每一个顶点建立一个单链表,每个结点的组成尾三部分,adjvex(指向邻接点)-nextarc(指向下一结点)-info(顶点信息),加一个头结点,data(数据域)-firstarc(邻接点)。
邻接表存储:
#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* INT_MAX等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */#define MAX_NAME 5 /* 顶点字符串的最大长度 */typedef int InfoType;typedef char VertexType[MAX_NAME]; /* 字符串类型 *//* c7-2.h 图的邻接表存储表示 */#define MAX_VERTEX_NUM 20typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */typedef struct ArcNode{int adjvex; /* 该弧所指向的顶点的位置 */struct ArcNode *nextarc; /* 指向下一条弧的指针 */InfoType *info; /* 网的权值指针) */}ArcNode; /* 表结点 */typedef struct{VertexType data; /* 顶点信息 */ArcNode *firstarc; /* 第一个表结点的地址,指向第一条依附该顶点的弧的指针 */}VNode,AdjList[MAX_VERTEX_NUM]; /* 头结点 */typedef struct{AdjList vertices;int vexnum,arcnum; /* 图的当前顶点数和弧数 */int kind; /* 图的种类标志 */}ALGraph;
三:图的遍历
从图的某一顶点出发访问图的其它结点,且只访问一次,叫图的遍历。
1.图的深度优先遍历(DFS)
2.图的广度优先遍历(BFS)
四:图的最小生成树
求最小生成树算法:普里姆算法、克鲁斯卡尔算法。
五:拓扑排序
简单的说,就是由某个集合上的偏序求全序。用AOV-网中顶点来表示活动,多应用于求工程能否进行。
六:关键路径
用到AOE-网中弧表示活动,顶点表示事件,从源点到终点的最长路径为关键路径。
七:最短路径
求单源点到其他顶点的最短路径:迪杰斯特拉算法。
求每一对顶点的最短路径:弗洛伊德算法。