102 阅读1分钟

图的基本介绍这里就不再赘述了,这里介绍怎样用代码实现图,毕竟可以有很多种方法表达一个图,这样的话,算法题中千奇百怪的表达方式会让我们头疼死了,下面介绍可以进行转化的模板。

啥也不说,直接上代码。

    //图
    public class Graph{
        //点集,存入的是点的编号和对应的点的实际结构
        public HashMap<Integer, Node> nodes;
        //边集
        public HashSet<Edge> edges;

        public Graph(){
            nodes = new HashMap<>();
            edges = new HashSet<>();
        }
    }
    
    //点
    public class Node{
        //自己的数据项,也就是点上的值,根据情况可能是String类型
        public int value;
        //这个点对应的入度
        public int in;
        //这个点对应的出度
        public int out;
        //这个点的邻接点(只管发散出去的方向,也就是只管出度方向链接的节点)
        public ArrayList<Node> nexts;
        //属于我的边有哪些(只指得是出度的边,入度到我这里的不算)
        public ArrayList<Edge> edges;

        public Node(int value){
            //对于in和out,不直接赋值了,需要调用节点.in,节点.out赋值
            this.value = value;
            in = 0;
            out = 0;
            nexts = new ArrayList<>();
            edges = new ArrayList<>();
        }
    }
    
    //边
    public class Edge{
        //边上的权重,一般指的是距离的意思
        public int weight;
        public Node from;
        public Node to;

        public Edge(int weight, Node from, Node to){
            this.weight = weight;
            this.from = from;
            this.to = to;
        }
    }