天天看点

pb代码graph绘图表_图的邻接表实现

睚雪:图(邻接矩阵)​zhuanlan.zhihu.com

pb代码graph绘图表_图的邻接表实现

上面那个连接关于图的基础概念和DFS BFS都有介绍

前文又介绍到邻接矩阵的缺点以及好处 为了解决他生成稀疏图浪费的缺点我们可以选择另一种实现方式 邻接矩阵

实现方式

pb代码graph绘图表_图的邻接表实现

上面的图片来自于https://blog.csdn.net/weixin_39469127/article/details/81082019

如果这位作者不允许我使用的话可以联系我 我会撤掉

邻接表是一个链表的集合,对于每一个节点V建立一个链表将每一个非零边存储在链表里 采用头插法

特点:

  1. 对于系稀疏图比较划算,但是稠密图就浪费了
  2. 里面每一个节点占据两个空间都可能被存储多次
  3. 对于寻找邻接点也是很方便的,只需要沿着那个节点的链表遍历就可以了
  4. 方便计算无向图的度,但是对于有向图只能计算出度 计算入度需要一个逆邻接表
  5. 关于出入度 我想着可以在节点实现类里增加两个值分别代表出入度 就比较好计算了
  6. 正邻接表是将邻接矩阵的每一行存成链表 逆邻接表是将每一列存成链表

代码结构

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("");
        }
    }           

继续阅读