图的代码实现(Java)

一、图的分类
有向图和无向图
二、图的表示方法
邻接表法和邻接矩阵法还有边集数组法
①邻接表法:就是对于每个节点记录到另外一个节点的信息以及权重
②邻接矩阵法;就是用一个矩阵来记录各个节点之间的连接情况以及权重,用无穷来表示不可达
③边集数组:边集数组是由两个一维数组构成的。一个是存储顶点的信息,另一个是存储边的信息,这个边数组是由每个数据元素的起始点坐标、终点坐标以及权重组成的。边集数组有一个特点,就是要查找一个顶点的度的时候需要扫描整个数组,因此不适合对顶点的操作,一般我们用它来做对边的依次操作,关于边集数组的应用为克鲁斯卡尔(Kruskal)算法。
三、如何生成图:
我们一般使用的生成一张图的算法是使用的是边集数组的方法:
①建立一个图,也就是抽象图的信息:
import java.util.HashMap;
import java.util.HashSet;
/**
* 图用代码来表示
* 只需要记录点的集合和边的集合就行了
* @author zhmm
*
*/
public class Graph {
public HashMap<Integer,Node> nodes;
public HashSet<Edge> edges;

public Graph() {
nodes = new HashMap<>();
edges = new HashSet<>();
}
}
②构建图的节点的信息:
import java.util.ArrayList;
/**
* 图的节点的表示
* @author zhmm
*
*/
public class Node {
/*
* value:表示的是节点的值
* in:表示的是节点的入度
* out:表示的是节点的出度
* next:表示的是指向下一个节点的指针(邻接节点)的集合(我是from)
* edges:表示的是从我出发发散的边的集合(我也是from)
*/
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<>();
}
}
③构建图的边
public class Edge {
/*
* weigh:表示的是该边的权重是什么
* from:表示的是该边的开始节点是什么
* to:表示该边指向的节点是什么
*/
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;
}

}
④根据边集数组来生成图
**
* 图的生成:
* 本次是使用的是边集数组来实现图这种结构的:
* 该二维数组里面的每一个数组都记录的是该边的权重、from、to(matrix这个数组里的每一个数组的第一个元素代表的就是权重、二个表示的是起始节点、第三个表示的是结束节点)
* 然后我们根据这些二维数组来实现图这种数据结构
* @author zhmm
*
*/
public class GraphGenerator {

public static Graph createGraph(Integer[][] matrix) {
Graph graph = new Graph();
for (int i = 0; i < matrix.length; i++) {
Integer from = matrix[i][0];
Integer to = matrix[i][1];
Integer weight = matrix[i][2];
if (!graph.nodes.containsKey(from)) {
graph.nodes.put(from, new Node(from));
}
if (!graph.nodes.containsKey(to)) {
graph.nodes.put(to, new Node(to));
}
Node fromNode = graph.nodes.get(from);
Node toNode = graph.nodes.get(to);
Edge newEdge = new Edge(weight, fromNode, toNode);
fromNode.nexts.add(toNode);
fromNode.out++;
toNode.in++;
fromNode.edges.add(newEdge);
graph.edges.add(newEdge);
}
return graph;
}

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值