ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-08-13 14:32:44  阅读:138  来源: 互联网

标签: Node matrix graph new nodes public


一、为什么要有图

 

 

二、图的常用概念

    

  

 三、图的表示方法

 

 1、邻接矩阵

 

 2、邻接表

 

 四、图的快速入门案例

 五、图的表示方式

图的结构表示方式有很多,当遇到其它表示方式时,可以把图转化为以下结构再进行后续操作

package Algorithms.Graph;

import java.util.HashMap;
import java.util.HashSet;
import java.util.ArrayList;

//图的结构
public class Graph {
    //点集
    public HashMap<Integer,Node> nodes; //Interger:点的编号  Node:实际点
    //边集
    public HashSet<Edge> edges;

    public Graph() {
        nodes = new HashMap<>();
        edges = new HashSet<>();
    }
}

//点
class Node {
    public int value;              //点上的值
    public int in;                 //点的入度:有多少边可以指向这个点
    public int out;                //点的出度:有多少边可以指出这个点
    public ArrayList<Node> nexts;  //从当前这个点出发,由它发散出去的边的邻居有哪些点
    public ArrayList<Edge> edges;  //由当前点出发的边

    public Node(int value) {
        this.value = value;
        in = 0;
        out = 0;
        nexts = new ArrayList<>();
        edges = new ArrayList<>();
    }
}

//有向边 (两个有向边可以拼成一个无向边)
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;
    }
}

 学会创建接口把其它图的结构(下图)转化为自己所熟悉的结构(上面代码所示)

 

 写一个转化的接口:

package Algorithms.Graph;

public class GraphGenerator {

    //接口(模板):把用户给的图结构转化为自己熟悉的图结构
    //matrix 所有的边   N*3的矩阵
    //[weight,from,to]
    public static Graph createGraph(Integer[][] matrix) {
        Graph graph = new Graph();
        for (int i = 0; i < matrix.length; i++) { //matrix[0][0]  matrix[0][1]  matrix[0][2]
            Integer weight = matrix[i][0];
            Integer from = matrix[i][1];
            Integer to = matrix[i][2];
            if (!graph.nodes.containsKey(from)) {      //from节点(城市)不存在
                graph.nodes.put(from, new Node(from)); //在点集中新建这个from节点(编号,对应的城市)
            }
            if (!graph.nodes.containsKey(to)) {       //to节点(城市)不存在
                graph.nodes.put(to, new Node(to));    //在点集中新建这个to节点(编号,对应的城市)
            }
            Node fromNode = graph.nodes.get(from);
            Node toNode = graph.nodes.get(to);
            Edge newEdge = new Edge(weight, fromNode, toNode); //新建边
            fromNode.nexts.add(toNode); //添加from节点的邻居,toNode
            fromNode.out++; //出度++
            toNode.in++; //入度++
            fromNode.edges.add(newEdge); //添加属于fromNode的边
            graph.edges.add(newEdge); //把新建的边放入边集中
        }
        return graph;
    }

}

 

标签:,Node,matrix,graph,new,nodes,public
来源: https://www.cnblogs.com/zh-xiaoyuan/p/15037360.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有