生成图、表示图的一个强大方法

图的表示一般是可以使用邻接表、邻接矩阵……来表示的,网上大把,这里介绍的是一种更为强大的方式,基本上可以应对所有的关于图的算法,例如拓扑排序深搜广搜KruskalPrim、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>();
	}
}


猜你喜欢

转载自blog.csdn.net/qq_38238041/article/details/79698619