图顶点: package org.pbdevj.ds.graph; /**图顶点*/ public class Node implements Comparable<Node> { public Object value; @Override public String toString() { // TODO Auto-generated method stub return value.toString(); } public Node() { // TODO Auto-generated constructor stub } public Node(Object value) { // TODO Auto-generated constructor stub this.value = value; } @Override public int compareTo(Node o) { // TODO Auto-generated method stub return this.toString().compareTo(o.toString()); } } 连接顶点的边: package org.pbdevj.ds.graph; /**连接顶点的边*/ public class Border { /**边的第一个节点*/ public Node fNode; /**边的最后一个节点*/ public Node lNode; /**边的权值*/ public Object power; public Border() { // TODO Auto-generated constructor stub } public Border(Node fNode,Node lNode) { // TODO Auto-generated constructor stub this.fNode = fNode; this.lNode = lNode; this.power = null; } public Border(Node fNode,Node lNode,Object power) { // TODO Auto-generated constructor stub this.fNode = fNode; this.lNode = lNode; this.power = power; } @Override public String toString() { // TODO Auto-generated method stub return this.power.toString(); } } 图的接口: package org.pbdevj.ds.graph; public interface IGraph { /**两个顶点是连接的*/ int CONNECTED = 1; /**两个顶点不是连接的*/ int UN_CONNECTED = 0; /**输出矩阵*/ public void outputMatrix(); /**深度优先搜索*/ public void depthPrioritySearch(IGraphSearchCallBack searchCallBack); /**广度优先搜索*/ public void spanPrioritySearch(IGraphSearchCallBack searchCallBack); } 图的实现: package org.pbdevj.ds.graph; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; /**无权图【邻接矩阵存储】*/ public class Graph implements IGraph{ private Node[] nodes; private Border[] borders; /**邻接矩阵*/ private int[][] adjacencyMatrix; public Graph() { // TODO Auto-generated constructor stub } public Graph(Node[] nodes,Border[] borders) { // TODO Auto-generated constructor stub this.nodes = nodes; this.borders = borders; //初始化邻接矩阵 adjacencyMatrix = new int[nodes.length][nodes.length]; initMatrix(); } /** * 初始化邻接矩阵 * */ private void initMatrix(){ int fIndex = 0,lIndex=0; for (Border border : borders) { fIndex = findNode(border.fNode); lIndex = findNode(border.lNode); if (fIndex>=0 && lIndex>=0){ adjacencyMatrix[fIndex][lIndex]=CONNECTED; adjacencyMatrix[lIndex][fIndex]=CONNECTED; } } } /**查找节点在节点数组中的位置*/ private int findNode(Node n){ for (int i = 0; i < nodes.length; i++) { if (nodes[i].equals(n)){ return i; } } return -1; } /**输出矩阵*/ @Override public void outputMatrix() { if (nodes==null) return; System.out.println("--------------------------------矩阵信息[无权图]------------------------------------"); for (Node n : nodes) { System.out.print("/t"+n); } System.out.println(); for (int i=0; i<nodes.length; i++) { System.out.print(nodes[i]+"/t"); for(int j=0; j<nodes.length; j++){ System.out.print(adjacencyMatrix[i][j]+"/t"); } System.out.println(); } } /**深度优先搜索*/ @Override public void depthPrioritySearch(IGraphSearchCallBack searchCallBack) { // TODO Auto-generated method stub if(nodes==null || nodes.length==0) return; Set<Node> set = new TreeSet<Node>();//存放搜索过的顶点 for (Node node : nodes) { if (!set.contains(node)){//如果该顶点没有被搜索过则搜索该顶点 set.add(node); _depthPrioritySearch(set, node, searchCallBack); } } } /**深度优先搜索[递归函数]*/ private void _depthPrioritySearch(Set<Node> set,Node searchNode,IGraphSearchCallBack searchCallBack){ // TODO Auto-generated method stub if (searchCallBack!=null) searchCallBack.visit(searchNode); int nodeIndex = findNodeIndex(searchNode);//获取当前节点索引 for (int i = 0; i < nodes.length; i++) { if (adjacencyMatrix[nodeIndex][i]==CONNECTED && adjacencyMatrix[i][nodeIndex]==CONNECTED && !set.contains(nodes[i])){//顶点之间是连通的并且该顶点没有被访问过 set.add(nodes[i]);//添加到已搜索集合 _depthPrioritySearch(set,nodes[i],searchCallBack); } } // if (_set.size()==0)//如果没有搜索到关联的顶点则返回 // return; // // set.addAll(_set);//添加到已搜索集合 // // for (Node node : _set) {//依次再搜索集合的每个顶点关联的顶点 // _depthPrioritySearch(set,node,searchCallBack); // } } /**广度优先搜索*/ @Override public void spanPrioritySearch(IGraphSearchCallBack searchCallBack) { // TODO Auto-generated method stub if(nodes==null || nodes.length==0) return; Set<Node> set = new TreeSet<Node>();//存放搜索过的顶点 for (Node node : nodes) { if (!set.contains(node)){//如果该顶点没有被搜索过则搜索该顶点 if(searchCallBack!=null){ searchCallBack.visit(node); } set.add(node); _spanPrioritySearch(set, node, searchCallBack); } } } /**广度优先搜索[递归函数]*/ private void _spanPrioritySearch(Set<Node> set,Node searchNode,IGraphSearchCallBack searchCallBack) { // TODO Auto-generated method stub int nodeIndex = findNodeIndex(searchNode);//获取当前节点索引 Set<Node> _set = new TreeSet<Node>();//存放当前顶点的关联顶点 for (int i = 0; i < nodes.length; i++) { if (adjacencyMatrix[nodeIndex][i]==CONNECTED && adjacencyMatrix[i][nodeIndex]==CONNECTED && !set.contains(nodes[i]))//顶点之间是连通的并且该顶点没有被访问过 _set.add(nodes[i]);//把搜索到得节点存入集合 } if (_set.size()==0)//如果没有搜索到关联的顶点则返回 return; set.addAll(_set);//添加到已搜索集合 if(searchCallBack!=null){ for (Node node : _set) {//广度优先搜索先处理最近的顶点 searchCallBack.visit(node); } } for (Node node : _set) {//依次再搜索集合的每个顶点关联的顶点 _spanPrioritySearch(set,node,searchCallBack); } } private int findNodeIndex(Node node){ if(nodes==null || nodes.length==0){ return -1; } for (int i = 0; i < nodes.length; i++) { if (nodes[i].equals(node)){ return i; } } return -1; } } 图搜索回调接口: package org.pbdevj.ds.graph; /**图搜索回调接口*/ public interface IGraphSearchCallBack { public void visit(Node element); } 有权图参考: package org.pbdevj.ds.graph; /**有权图【邻接矩阵存储】*/ public class GraphPower implements IGraph { private Node[] nodes; private Border[] borders; /**邻接矩阵*/ private Object[][] adjacencyMatrix; public GraphPower() { // TODO Auto-generated constructor stub } public GraphPower(Node[] nodes,Border[] borders) { // TODO Auto-generated constructor stub this.nodes = nodes; this.borders = borders; //初始化邻接矩阵 adjacencyMatrix = new Object[nodes.length][nodes.length]; initMatrix(); } /** * 初始化邻接矩阵 * */ private void initMatrix(){ //把每位默认设置为无穷大 for (int i = 0; i < nodes.length; i++) { for (int j = 0; j < nodes.length; j++) { adjacencyMatrix[i][j] = "∞"; } } int fIndex = 0,lIndex=0; for (Border border : borders) { fIndex = findNode(border.fNode); lIndex = findNode(border.lNode); if (fIndex>=0 && lIndex>=0){ adjacencyMatrix[fIndex][lIndex]=border.power; adjacencyMatrix[lIndex][fIndex]=border.power; } } } /**查找节点在节点数组中的位置*/ private int findNode(Node n){ for (int i = 0; i < nodes.length; i++) { if (nodes[i].equals(n)){ return i; } } return -1; } /**输出矩阵*/ @Override public void outputMatrix() { if (nodes==null) return; System.out.println("--------------------------------矩阵信息[有权图]------------------------------------"); for (Node n : nodes) { System.out.print("/t"+n); } System.out.println(); for (int i=0; i<nodes.length; i++) { System.out.print(nodes[i]+"/t"); for(int j=0; j<nodes.length; j++){ System.out.print(adjacencyMatrix[i][j]+"/t"); } System.out.println(); } } @Override public void depthPrioritySearch(IGraphSearchCallBack searchCallBack) { // TODO Auto-generated method stub } @Override public void spanPrioritySearch(IGraphSearchCallBack searchCallBack) { // TODO Auto-generated method stub } } 测试代码: package org.pbdevj.ds.graph.utest; import org.pbdevj.ds.graph.Border; import org.pbdevj.ds.graph.Graph; import org.pbdevj.ds.graph.GraphPower; import org.pbdevj.ds.graph.IGraph; import org.pbdevj.ds.graph.IGraphSearchCallBack; import org.pbdevj.ds.graph.Node; public class GraphTest { /** * 图的构造 */ // public static void main(String[] args) { // // TODO Auto-generated method stub // /* // * 10 // * * * * // * 20 30 40 // * * * * // * 50 60 * 70 // * // * 80 // * * * // * 90 100 // * // * // * */ // Node n1 = new Node(10); // Node n2 = new Node(20); // Node n3 = new Node(30); // Node n4 = new Node(40); // Node n5 = new Node(50); // Node n6 = new Node(60); // Node n7 = new Node(70); // Node n8 = new Node(80); // Node n9 = new Node(90); // Node n10 = new Node(100); // // Node[] nodes = {n1,n2,n3,n4,n5,n6,n7,n8,n9,n10}; // // Border b1 = new Border(n1,n2,10); // Border b2 = new Border(n1,n3,20); // Border b3 = new Border(n1,n4,30); // Border b4 = new Border(n2,n5,40); // Border b5 = new Border(n3,n6,50); // Border b6 = new Border(n3,n7,50); // Border b7 = new Border(n6,n7,50); // // Border b8 = new Border(n8,n9,50); // Border b9 = new Border(n8,n10,50); // // Border[] bs = {b1,b2,b3,b4,b5,b6,b7,b8,b9}; // // IGraph g = null; // g = new Graph(nodes, bs); // g.outputMatrix(); // // g = new GraphPower(nodes, bs); // g.outputMatrix(); // // } /**图的搜索*/ public static void main(String[] args) { // TODO Auto-generated method stub /* * 10 * * * * * 20 30 40 * * * * * 50 60 * 70 * * 80 * * * * 90 100 * * * */ Node n1 = new Node(10); Node n2 = new Node(20); Node n3 = new Node(30); Node n4 = new Node(40); Node n5 = new Node(50); Node n6 = new Node(60); Node n7 = new Node(70); Node n8 = new Node(80); Node n9 = new Node(90); Node n10 = new Node(100); Node[] nodes = {n1,n2,n3,n4,n5,n6,n7,n8,n9,n10}; Border b1 = new Border(n1,n2,10); Border b2 = new Border(n1,n3,20); Border b3 = new Border(n1,n4,30); Border b4 = new Border(n2,n5,40); Border b5 = new Border(n3,n6,50); Border b6 = new Border(n3,n7,50); Border b7 = new Border(n6,n7,50); Border b8 = new Border(n8,n9,50); Border b9 = new Border(n8,n10,50); Border b10 = new Border(n1,n7,50); Border[] bs = {b1,b2,b3,b4,b5,b6,b7,b8,b9,b10}; IGraph g = null; g = new Graph(nodes, bs); //广度优先搜索 // g.spanPrioritySearch(new IGraphSearchCallBack() { // // @Override // public void visit(Node element) { // // TODO Auto-generated method stub // System.out.println(element.value.toString()); // } // }); //深度优先搜索 g.depthPrioritySearch(new IGraphSearchCallBack() { @Override public void visit(Node element) { // TODO Auto-generated method stub System.out.println(element.toString()); } }); } }