用邻接矩阵存放图中顶点的关系,实现无向图的邻接矩阵存储。
1)图的建立,删除(添加,删除边/顶点)
2)广度和深度优先遍历
3)prim最小生成树
1,成员变量,构造函数,以及数组扩展
实现策略:维护一个顶点的数组,以及一个二维的数组来表示顶点之间的关系,维护2个基本变量记录顶点和边的数量。
重点是:1)可以动态扩展顶点数组,并保持数组的连续性,这意味着删除顶点时后面的顶点要前移,那么顶点的编号也变了,关系矩阵也要改变。 2)关系矩阵也动态维护,随时保持和顶点数组一样大。顶点数组的长度为VNodes.length,实际存放了顶点的位置只到了size()处,对应的,关系矩阵的大小为int[VNodes.length][VNodes.length],实际有效地区域也只在左上角的int[size()][size()]范围内。
2,建图,删图相关方法分析
用邻接矩阵存储表示顶点之间的关系果然比邻接表在代码实现上简单很多
1)添加边,只需要在关系矩阵M的两个位置上赋值即可,而在邻接表实现中,要在2个顶点的边链表的最后都添加上一个边
2)删除边,1)的逆过程,将那2个位置的值置为0即可,而在邻接表的实现中,也是要到边链表中去删(还要记录被删边得前缀)
3)添加顶点,直接在顶点数组中添加一个,注意如果满的话,要扩展,在扩展方法中,已经实现了同时扩展关系矩阵(将矩阵变大了,左上角有效区域还是不变)。在邻接表中这个稍微简单点,因为邻接表直接扩展数组即可,关系不用动。
1)图的建立,删除(添加,删除边/顶点)
2)广度和深度优先遍历
3)prim最小生成树
1,成员变量,构造函数,以及数组扩展
实现策略:维护一个顶点的数组,以及一个二维的数组来表示顶点之间的关系,维护2个基本变量记录顶点和边的数量。
重点是:1)可以动态扩展顶点数组,并保持数组的连续性,这意味着删除顶点时后面的顶点要前移,那么顶点的编号也变了,关系矩阵也要改变。 2)关系矩阵也动态维护,随时保持和顶点数组一样大。顶点数组的长度为VNodes.length,实际存放了顶点的位置只到了size()处,对应的,关系矩阵的大小为int[VNodes.length][VNodes.length],实际有效地区域也只在左上角的int[size()][size()]范围内。
/*总是将关系矩阵保持和顶点数组大小对应,顶点数组不一定放满,关系矩阵也只
* 在左上角放满,顶点数组放满的大小为size(),关系矩阵也只到size()*/
private VNode[] VNodes;
private int[][] M;
private int nodeCount;
private int edgeCount;
public MatUnDirectedGraph()
{
VNodes = new VNode[5];
M = new int[5][5];
nodeCount = 0;
edgeCount = 0;
}
public void expand()
{
VNode[] larger = new VNode[VNodes.length * 2];//顶点数组扩大
int[][] M_larger = new int[larger.length][larger.length];//关系矩阵也要扩展
for(int i = 0;i < VNodes.length;i++)
{
larger[i] = VNodes[i];
for(int j = 0;j < VNodes.length;j++)
M_larger[i][j] = M[i][j];
}
VNodes = larger;
M = M_larger;
}
2,建图,删图相关方法分析
用邻接矩阵存储表示顶点之间的关系果然比邻接表在代码实现上简单很多
1)添加边,只需要在关系矩阵M的两个位置上赋值即可,而在邻接表实现中,要在2个顶点的边链表的最后都添加上一个边
2)删除边,1)的逆过程,将那2个位置的值置为0即可,而在邻接表的实现中,也是要到边链表中去删(还要记录被删边得前缀)
3)添加顶点,直接在顶点数组中添加一个,注意如果满的话,要扩展,在扩展方法中,已经实现了同时扩展关系矩阵(将矩阵变大了,左上角有效区域还是不变)。在邻接表中这个稍微简单点,因为邻接表直接扩展数组即可,关系不用动。