睚雪:图(邻接矩阵)zhuanlan.zhihu.com
上面那个连接关于图的基础概念和DFS BFS都有介绍
前文又介绍到邻接矩阵的缺点以及好处 为了解决他生成稀疏图浪费的缺点我们可以选择另一种实现方式 邻接矩阵
实现方式
上面的图片来自于https://blog.csdn.net/weixin_39469127/article/details/81082019
如果这位作者不允许我使用的话可以联系我 我会撤掉
邻接表是一个链表的集合,对于每一个节点V建立一个链表将每一个非零边存储在链表里 采用头插法
特点:
- 对于系稀疏图比较划算,但是稠密图就浪费了
- 里面每一个节点占据两个空间都可能被存储多次
- 对于寻找邻接点也是很方便的,只需要沿着那个节点的链表遍历就可以了
- 方便计算无向图的度,但是对于有向图只能计算出度 计算入度需要一个逆邻接表
- 关于出入度 我想着可以在节点实现类里增加两个值分别代表出入度 就比较好计算了
- 正邻接表是将邻接矩阵的每一行存成链表 逆邻接表是将每一列存成链表
代码结构
public class Vertex { //顶点的结构
public String verName;
int inRadius,outRadius; //出入度
public Vertex next; //下一个邻接点
}
public class Edge { //边的结构
public Integer fromvex,endvex; //用来表示有向边<fromvex,endvex> 存的是顶点下标
public Integer Weight; //权重
}
public class Graph { //图的结构
public static int MaxSize = 200;
public Vertex[] list = new Vertex[MaxSize];
public int verLength;
public int edgeLength;
public int type; //1无向无权重 2无向有权重 3有向无权重 4有向有权重
}
代码实现的功能
简单的查找节点和插入删除和输出自己看代码吧
删除可能写的不太好有意见就说吧
/**
* create by: 睚雪
* description: 根据顶点的名字来返回顶点
* create time: 2020-3-16 9:25
* @params [name]
* @return Vertex
*/
public Vertex getVertex(Graph graph,String name){
Scanner bf = new Scanner(new InputStreamReader(System.in));
for (int i = 0; i < graph.list.length; i++) {
if(graph.list[i].verName.equals(name)){
return graph.list[i];
}
}
return null;
}
/**
* create by: 睚雪
* description: 插入一条边
* create time: 2020-3-17 9:04
* @params [graph, edge]
* @return void
*/
public void insertEdge(Graph graph,Edge edge){
Vertex fromvex = graph.getVertex(graph, edge.fromvex + "");
Vertex endvex = graph.getVertex(graph, edge.endvex + "");
if(fromvex==null||endvex==null){
return;
}
Vertex vertex = new Vertex();
vertex.verName = endvex.verName;
vertex.next = fromvex.next;
fromvex.next = vertex;
if(graph.type==1||graph.type==2){
Vertex v2 = new Vertex();
v2.verName = fromvex.verName;
v2.next = endvex.next;
endvex.next = v2;
}
}
/**
* create by: 睚雪
* description: 删除一个边
* create time: 2020-3-17 9:11
* @params [graph, edge]
* @return void
*/
public void deleteEdge(Graph graph,Edge edge){
Vertex fromvex = graph.getVertex(graph, edge.fromvex + "");
Vertex endvex = graph.getVertex(graph, edge.endvex + "");
if(fromvex==null||endvex==null){
return;
}
delete(graph,fromvex,endvex);
if(graph.type==1||graph.type==2){
delete(graph,endvex,fromvex);
}
}
public void delete(Graph graph,Vertex fromvex,Vertex endvex){
boolean flag = false;
Vertex vertex = fromvex;
while(true){
if(vertex.next!=null){
if(!vertex.next.verName.equals(endvex.verName)){
vertex = vertex.next;
}else{
flag = true;
break;
}
}else{
break;
}
}
if(flag){
vertex.next = vertex.next.next;
}
}
/**
* create by: 睚雪
* description: 输出图
* create time: 2020-3-16 10:09
* @params [graph]
* @return void
*/
public void outputGraph(Graph graph){
for (int i = 0; i < graph.list.length; i++) {
System.out.print("第" + i + "个节点" + graph.list[i].verName+"他的邻接点");
Vertex vertex = graph.list[i].next;
while(vertex!=null){
System.out.print(vertex.verName+"/");
vertex = vertex.next;
}
System.out.println("");
}
}