diff --git "a/\345\233\276_\351\201\215\345\216\206/AMWGraph.java" "b/\345\233\276_\351\201\215\345\216\206/AMWGraph.java" new file mode 100644 index 0000000000000000000000000000000000000000..40f1cfd25a9ebc1369f1256eeef0bb246a93a83a --- /dev/null +++ "b/\345\233\276_\351\201\215\345\216\206/AMWGraph.java" @@ -0,0 +1,150 @@ +package 图_遍历; + +import java.util.ArrayList; +import java.util.LinkedList; +/** + * @description 邻接矩阵模型类 + * @author beanlam + * @time 2015.4.17 + */ +public class AMWGraph { + private ArrayList vertexList;//存储点的链表 + private int[][] edges;//邻接矩阵,用来存储边 + private int numOfEdges;//边的数目 + + public AMWGraph(int n) { + //初始化矩阵,一维数组,和边的数目 + edges=new int[n][n]; + vertexList=new ArrayList(n); + numOfEdges=0; + } + + //得到结点的个数 + public int getNumOfVertex() { + return vertexList.size(); + } + + //得到边的数目 + public int getNumOfEdges() { + return numOfEdges; + } + + //返回结点i的数据 + public Object getValueByIndex(int i) { + return vertexList.get(i); + } + + //返回v1,v2的权值 + public int getWeight(int v1,int v2) { + return edges[v1][v2]; + } + + //插入结点 + public void insertVertex(Object vertex) { + vertexList.add(vertexList.size(),vertex); + } + + //插入结点 + public void insertEdge(int v1,int v2,int weight) { + edges[v1][v2]=weight; + numOfEdges++; + } + + //删除结点 + public void deleteEdge(int v1,int v2) { + edges[v1][v2]=0; + numOfEdges--; + } + + //得到第一个邻接结点的下标 + public int getFirstNeighbor(int index) { + for(int j=0;j0) { + return j; + } + } + return -1; + } + + //根据前一个邻接结点的下标来取得下一个邻接结点 + public int getNextNeighbor(int v1,int v2) { + for (int j=v2+1;j0) { + return j; + } + } + return -1; + } + + //私有函数,深度优先遍历 + private void depthFirstSearch(boolean[] isVisited,int i) { + //首先访问该结点,在控制台打印出来 + System.out.print(getValueByIndex(i)+" "); + //置该结点为已访问 + isVisited[i]=true; + + int w=getFirstNeighbor(i);// + while (w!=-1) { + if (!isVisited[w]) { + depthFirstSearch(isVisited,w); + } + w=getNextNeighbor(i, w); + } + } + + //对外公开函数,深度优先遍历,与其同名私有函数属于方法重载 + public void depthFirstSearch() { + boolean[] isVisited=new boolean[getNumOfVertex()]; + //记录结点是否已经被访问的数组 + for (int i=0;i vertexList;//存储顶点集合 + private int[][] edges;//存储图对应的邻接矩阵 + private int numOfEdges;//表示边的数目 + + public static void main(String[] args) { + //测试图是否创建正确 + int n = 5;//结点的个数 + String VertexValue[] = {"A","B","C","D","E"}; + //创建图对象 + Graph graph = new Graph(n); + //循环的添加顶点 + for(String value : VertexValue) { + graph.inserVertex(value); + } + //添加边 + graph.insertEdge(0, 1, 1); + graph.insertEdge(0, 2, 1); + graph.insertEdge(1, 2, 1); + graph.insertEdge(1, 3, 1); + graph.insertEdge(1, 4, 1); + + //显示一把邻接矩阵 + graph.showGraph(); + } + + //构造器 + public Graph(int n) { + //初始化矩阵和vertexList + edges = new int[n][n]; + vertexList = new ArrayList(n); + numOfEdges = 0; + } + //图中常用的方法 + //返回结点的个数 + public int getNumOfVertex() { + return vertexList.size(); + } + //显示图对应的矩阵 + public void showGraph() { + for(int[] link : edges) { + System.out.println(Arrays.toString(link)); + } + } + //得到边的数目 + public int getNumOfEdges() { + return numOfEdges; + } + //返回结点i(下标)对应的数据 + public String getValueByIndex(int i) { + return vertexList.get(i); + } + //返回v1和v2的权值 + public int getWeight(int v1, int v2) { + return edges[v1][v2]; + } + //插入结点 + public void inserVertex(String vertex) { + vertexList.add(vertex); + } + //添加边 + /** + * + * @param v1 表示点的下标即是第几个顶点 + * @param v2 第二个顶点对应的下标 + * @param weight 边的权值 + */ + public void insertEdge(int v1, int v2, int weight) { + edges[v1][v2] = weight; + edges[v2][v1] = weight; + numOfEdges++; + } +} + diff --git "a/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Edge.java" "b/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Edge.java" new file mode 100644 index 0000000000000000000000000000000000000000..514311219a61cbe8f5f5915ef267a3ee0fbaab83 --- /dev/null +++ "b/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Edge.java" @@ -0,0 +1,19 @@ +package 邻接表表示法; + +/** + * 图的边类 + */ +public class Edge { + /** + * 边的尾部节点名称 + */ + String tailName; + /** + * 边的权值 + */ + int weight; + /** + * 头节点的其他边 + */ + Edge broEdge; +} \ No newline at end of file diff --git "a/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Graph.java" "b/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Graph.java" new file mode 100644 index 0000000000000000000000000000000000000000..ba70e9caadc3e03902e358934047cbd9d3e00a03 --- /dev/null +++ "b/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Graph.java" @@ -0,0 +1,81 @@ +package 邻接表表示法; + +import java.util.Scanner; + +/** + * 图类,在构造方法中完成图的构造 + */ +public class Graph { + /** + * 图的节点个数 + */ + int verNum; + /** + * 图的边的条数 + */ + int edgeNum; + /** + * 图的邻接表中存储节点的数组 + */ + Vertex[] verArray; + + /** + * Graph类的构造方法,依次读取节点、边等信息,完成图的构建。 + */ + public Graph() { + Scanner scan = new Scanner(System.in); + System.out.println("请输入节点个数和边的个数:"); + verNum = scan.nextInt(); + edgeNum = scan.nextInt(); + verArray = new Vertex[verNum]; + + System.out.println("请依次输入节点的名称:"); + for (int i=0;i"+current.tailName); + current = current.broEdge; + } + System.out.println(); + } + } +} \ No newline at end of file diff --git "a/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Vertex.java" "b/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Vertex.java" new file mode 100644 index 0000000000000000000000000000000000000000..ff4ad4f9568cef026543e48ef421b335ad687d75 --- /dev/null +++ "b/\351\202\273\346\216\245\350\241\250\350\241\250\347\244\272\346\263\225/Vertex.java" @@ -0,0 +1,15 @@ +package 邻接表表示法; + + + public class Vertex { + /** + * 节点存储的内容 + */ + String verName; + /** + * 顶点的边链 + */ + Edge edgeLink; + + } +