图的基本构建

图有许多的存储和定义形式,这就导致图的每种算法针对不同的图的数据结构有不同的代码形式,所以为了便于解题,我们一般熟练一种图的数据结构所对应的算法,

然后解决问题时,只需要把题中所给的图转化为自己平常所使用的图,在套用自己的算法模板解题即可。

之后所有的图的算法都是针对该数据结构类型来对算法进行编码描述

 

一种可以广泛使用的便于解题的一种图的数据结构:

复制代码
 1 public class Graph {
 2     
 3     /*
 4      * 该图结构里包含的内容可以让所有算法都可以进行
 5      * 但是大部分算法都只要用到这张图的部分数据,所以针对不同的算法,根据自己的需要在建图时初始化数据
 6      */
 7     
 8     public HashMap<Integer,Node> nodes;//存储所有的点集,每个点除了点本身的属性外,还有一个编号
 9     public HashSet<Edge> edges;//存储所有的边集
10     
11     public Graph() {
12         nodes = new HashMap<>();
13         edges = new HashSet<>();
14     }
15 }
复制代码
复制代码
 1 public class Edge {//图中边的结构
 2     public int weight;//边的权值(长度)
 3     public Node from;//边的起点
 4     public Node to;//边的终点
 5     
 6     public Edge(int weight,Node from,Node to) {
 7         this.weight = weight;
 8         this.from = from;
 9         this.to = to;
10     }
11 }
复制代码
复制代码
 1 public class Node {//图中的点的结构
 2     int val;//用来存点的权值
 3     int in;//点的入度
 4     int out;//点的出度
 5     public ArrayList<Node> nexts;//存储所有与该点相连的其他点
 6     public ArrayList<Edge> edges;//存储以该点为一个端点的所有边
 7     
 8     public Node(int value) {
 9         this.val = value;
10         in = 0;
11         out = 0;
12         nexts = new ArrayList<>();
13         edges = new ArrayList<>();
14     }
15 }
复制代码

 

注意:
大部分算法都只要用到这个图的数据结构的部分数据,所以针对不同的算法,根据自己的需要在建图时初始化数据(没必要所有图的数据都进行初始化)

 

一个转换实例:

复制代码
 1 /*
 2      * 将二维数组的图的表现形式进行转化
 3      * 
 4      * 情境:
 5      * 给定一个N*3的二维矩阵Martix,矩阵的每一行的含义:
 6      * [边的权值,from节点上的值,to节点上的值]
 7      */
 8     public static Graph createGraph(Integer[][] martix) {
 9         Graph graph = new Graph();
10         for (int i = 0; i < martix.length; i++) {
11             int weight = martix[i][0];
12             int from = martix[i][1];
13             int to = martix[i][2];
14             if (!graph.nodes.containsKey(from)) {//如果点集不存在
15                 graph.nodes.put(from,new Node(from));
16             }
17             if (!graph.nodes.containsKey(to)) {
18                 graph.nodes.put(to, new Node(to));
19             }
20             Node fromNode = graph.nodes.get(from);
21             Node toNode = graph.nodes.get(to);
22             Edge edge = new Edge(weight,fromNode,toNode);
23             fromNode.nexts.add(toNode);
24             fromNode.edges.add(edge);
25             fromNode.out++;
26             toNode.edges.add(edge);
27             toNode.in++;
28             graph.edges.add(edge);
29         }
30         return graph;
31     }
复制代码

 

posted @   jue1e0  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示