图
一.思维导图
二.重要概念的笔记
1.假设图中有n个顶点,e条边
含有e=n(n-1)/2条边的无向图称为完全图;
含有e=n(n-1)条弧的有向图称为有向完全图;
若边或弧的个数e
2.
3.无向图的领接矩阵是对称的,有向图的领接矩阵可能是不对称的
4.在有向图中 统计第i行1的个数可得顶点i的出度(以顶点为头的弧的数目);
统计第j列1的个数可得顶点j的入度(以顶点为尾的弧的数目)
5.性质:任意无向图中,若有n个顶点和小于n-1条边,则必是非连通图;若有多于n-1条边,则一定有环
6.有向树:有向图中恰有一个顶点的入度为0,其余顶点的入度均为1
7.
8.结点i的度=邻接矩阵中第i行或第i列之和
9.构造无向图算法
O(n²+e*n)
Status CreateUDN(MGraph &G) {//采用数组(邻接矩阵)表示法,构造无向网G
scanf(&G.vexnum, &G.arcnum, &Inclnfo);//Inclnfo为0则各弧不含其他信息
for (i = 0;i < G.vexnum;++i)scanf(&G.vexs[i]);//构造顶点向量
for (i = 0; i < G.vexnum; ++i) //初始化邻接矩阵
for (j = 0;j < G.vexnum;++j)
G.arcs[i][j] = { INFINITYNULL }; //(adj, info)
for (k = 0;k < G.arcnum;++k) {//构造邻接矩阵
scanf(&v1, &v2, &w); //输入一条边依附的顶点及权值
i = LocateVex(Gv1);j = LocateVex(G, v2); //确定v1和v2在G中位置
G.arcs[i][j].adj = w; //弧的权值
if (Inclnfo)Input(*G.arcs[i]j].info); //若弧含有相关信息,则输入
G.arcs[j][i] = G.arcs[i][j]; //置的对称弧
}
return OK;
}// CreateUDN
10.对于稀疏图而言,邻接表比邻接矩阵节省存储空间
11.构造有向图算法
O(e*n)
Status CreateDG(OLGraph& G) { //采用十字链表存储表示,构造有向G(G.kind=DG)
scanf(&G.vexnum, &G.arcnum, &Inclnfo); //lnclnfo为0则各弧不含其他信息
for (i = 0; i < G.vexnum;++i) { //构造表头向量
scanf(&G.xlist[i].data); //输入顶点值
G.xlist[i].firstin = NULL;G.xlist[i].firstout = NULL; //初始化指针
}
for (k = 0;k < G.arcnum;++k) {//输入各弧并构造十字链表
sc