图的表示一般是可以使用邻接表、邻接矩阵……来表示的,网上大把,这里介绍的是一种更为强大的方式,基本上可以应对所有的关于图的算法,例如拓扑排序、深搜、广搜、Kruskal、Prim、Dijkstra。
创建图的时候是传递一个二维数组过来,matrix[i][0]是权重,matrix[i][1]是起始点的值,matrix[i][2]是终止点的值,最后返回一张图。
public class GraphGenerator {
//创建图
public static Graph creatGraph(Integer[][]matrix){
Graph graph = new Graph();
for(int i = 0;i < matrix.length;i++){
Integer weight = matrix[i][0];
Integer from = matrix[i][1];
Integer to = matrix[i][2];
//如果没有from点就建立一个
if(!graph.nodes.containsKey(from)){
graph.nodes.put(from, new Node(from));
}
//如果没有to点就建立一个
if(!graph.nodes.containsKey(to)){
graph.nodes.put(to, new Node(to));
}
//获取起始节点,终止节点
Node fromNode = graph.nodes.get(from);
Node toNode = graph.nodes.get(to);
//新建一条from到to 的边
Edge newEdge = new Edge(weight, fromNode, toNode);
//fromNode与toNode建立关联,将toNode放到fromNode的next集合
fromNode.nexts.add(toNode);//graph.nodes.get(from).nextx.add(toNode);
//改变fromNode与toNode的入度与出度
fromNode.out++;
toNode.in++;
//将建立好的边加入到边集(Graph,Node)
graph.edges.add(newEdge);
fromNode.edges.add(newEdge);
}
return graph;
}
}
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
public class Graph {
//点集,边集
public HashMap<Integer, Node>nodes;//点的编号,实际对应的点
public Set<Edge>edges;
public Graph(){
nodes = new HashMap<Integer, Node>();
edges = new HashSet<Edge>();
}
}
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;
}
}
import java.util.ArrayList;
public class Node {
public int value;//值
public int in;//入度,多少个节点指向我
public int out;//出度,我指向多少个节点
public ArrayList<Node>nexts;//从我出发能到达的邻居节点
public ArrayList<Edge>edges;//从我出发 的边的集合(from)
public Node(int value){
this.value = value;
in = 0;
out = 0;
nexts = new ArrayList<Node>();
edges = new ArrayList<Edge>();
}
}