图 

 

图的定义

顶点ii的出度:第ii行1的个数。顶点ii的入度,第ii列1的个数。

图由顶点集V(G)和边集E(G)组成,记为G=(V,E)。其中E(G)是边的有限集合,边是顶点的无序对(无向图)或有序对(有向图)。

对有向图来说,E(G)是有向边(也称弧(Arc))的有限集合,弧是顶点的有序对,记为<v,w><v,w>,v、w是顶点,v为弧尾(箭头根部),w为弧头(箭头处)。

对无向图来说,E(G)是边的有限集合,边是顶点的无序对,记为(v, w)或者(w, v),并且(v, w)=(w,v)。

ADT定义

6.3 图的ADT定义

数据对象集:一个非空的顶点集合和一个边集合,每条边用对应的一对顶点表示。

操作集:CreateGraph(&G, V, E) //创建

               DeatroyGraph(&G)//销毁

               InsertEdge(&G, e)//插入

               DeleteEdge(&G, e)//删除

               DFS(G, v)//深搜

               BFS(G, v)//广搜

               ......

 

 

图的储存

 

邻接矩阵

顶点ii的出度:第ii行1的个数。顶点ii的入度,第ii列1的个数。

typedef enum {DG, DN, UNG, UDN} GraphKind;//有向图,有向网,无向图,无向网
typedef struct ArcCell {
VRType adj;//无权图,用0,1表示;带权图,用权值类型表示
InfoType *info;//弧相关信息的指针
}ArcCell, AdjMatrix[maxn][maxn];
typedef struct {
VertexType vexs[maxn];//顶点信息
AdjMatrix arcs;//建立邻接矩阵
int vexnum, arcnum;//图的当前顶点数和弧数
GraphKind kind;
}MGraph;

 

邻接表

无向图的邻接表

typedef struct ArcNode {//一般结点
int adjvex;//该弧所指向的顶点的位置
struct ArcNode *nextarc;//链域,指向下一条边或者弧
}ArcNode;
typedef struct tnode{//表头结点
int vexdata;//存放顶点信息
ArcNode *firstarc;//指向第一个邻接点
}VNode, ADjList[maxn];
typedef struct{//最终建立邻接表
ADjList vertices;
int vexnum, arcnum;
int kind;
}ALGraph;

 

 

图的最小生成树
最小生成树的概念
包含无向连通图G所有n个顶点的极小连通子图称为G的生成树。

生成树的特点:T是G的连通子图;T包含G的所有顶点;T中无回路;T中有n-1条边。

权之和最小的生成树为最小生成树。

MST(Minimum Spanning Tree)性质: 若U集是V的一个非空子集,若(U0U0, V0V0)是一条权值最小的边,其中U0∈UU0∈U,V0∈V−UV0∈V−U,则:(U0U0, V0V0)必在最小生成树上。

Prim算法:将顶点归并,与边数无关,适合稠密网 O(n2)O(n2)
设G=(V,GE)为一个具有n个顶点的连通网络,T=(U,TE)为构造的生成树。

初始时,U={u0u0},TE为空集
在所有的u∈Uu∈U且v∈V−Uv∈V−U的边(u,v)中选择一条权值最小的边(u,v)
将(u,v)加入TE,同时将v加入U
重复23步,直到U=V为止

 

Kruskal算法:将边归并,适用于求稀疏网的最小生成树 O(eloge)O(eloge)
初始时最小生成树值包含图的n个顶点,每个顶点为一棵子树
选取权值较小且所关联的两个顶点不再同一连通分量的边,将此边加入最小生成树中
重复第二步n-1次,即得到包含n个顶点和n-1个条边的最小生成树

 

这章的学习还是老问题,只听理论,实操太少。很多时候代码都要百度,学着写也有种无从下手的感觉,希望之后能多腾点时间实操吧