diff --git a/README.md b/README.md index c7dc5aa5bba1afbc05a618946e230510e5bfd2c2..7c746b86f53960d3119d671558e6b29633ff82a6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ ### 截止日期 -2021.1.6 +2021.1.13 ### 基础 diff --git "a/\344\275\234\344\270\232/\345\233\276\351\201\215\345\216\206/Graphmatrix.java" "b/\344\275\234\344\270\232/\345\233\276\351\201\215\345\216\206/Graphmatrix.java" new file mode 100644 index 0000000000000000000000000000000000000000..0ba40c812a0c46e0bd1ab32eaed162641799637c --- /dev/null +++ "b/\344\275\234\344\270\232/\345\233\276\351\201\215\345\216\206/Graphmatrix.java" @@ -0,0 +1,168 @@ +package Graph; + + //用邻接矩阵表示一个图,并求深度优先搜索遍历和广度优先搜索遍历 20200340911 何灿烽 +import java.util.LinkedList; +import java.util.Queue; +import java.util.Scanner; + + +class Varr +{ + char data; + int du; + boolean visit; + public Varr(char data){ + this.data=data; + this.du=0; + this.visit=false; + } +} + + +public class Graphmatrix { + Varr varr[]; + int arcs[][]; + int num; + Scanner sc=new Scanner(System.in); + + public void creatGraph(){ + System.out.println("模拟一个矩阵表示图"); + + System.out.println("请输入顶点的个数:"); + num=sc.nextInt(); + varr=new Varr[num]; + arcs=new int[num][num]; + for(int i=0;i q=new LinkedList(); + + for(int i=0;i +{ + char data; + int du; + boolean visit; + public Varr(char data){ + this.data=data; + this.du=0; + this.visit=false; + } +} + + +public class Graphmatrix { + Varr varr[]; + int arcs[][]; + int num; + Scanner sc=new Scanner(System.in); + + public void creatGraph(){ + System.out.println("模拟一个矩阵表示图"); + + System.out.println("请输入顶点的个数:"); + num=sc.nextInt(); + varr=new Varr[num]; + arcs=new int[num][num]; + for(int i=0;i q=new LinkedList(); + + for(int i=0;i vertexList; //图的顶点集 + private Map> ver_edgeList_map; //图的每个顶点对应的有向边 + + public Graph(List vertexList, Map> ver_edgeList_map) { + super(); + this.vertexList = vertexList; + this.ver_edgeList_map = ver_edgeList_map; + } + + public List getVertexList() { + return vertexList; + } + + public void setVertexList(List vertexList) { + this.vertexList = vertexList; + } + + + public Map> getVer_edgeList_map() { + return ver_edgeList_map; + } + + public void setVer_edgeList_map(Map> ver_edgeList_map) { + this.ver_edgeList_map = ver_edgeList_map; + } + + + static class Edge{ + private Vertex startVertex; //此有向边的起始点 + private Vertex endVertex; //此有向边的终点 + private int weight; //此有向边的权值 + + public Edge(Vertex startVertex, Vertex endVertex, int weight) { + super(); + this.startVertex = startVertex; + this.endVertex = endVertex; + this.weight = weight; + } + + public Edge() + {} + + public Vertex getStartVertex() { + return startVertex; + } + public void setStartVertex(Vertex startVertex) { + this.startVertex = startVertex; + } + public Vertex getEndVertex() { + return endVertex; + } + public void setEndVertex(Vertex endVertex) { + this.endVertex = endVertex; + } + public int getWeight() { + return weight; + } + public void setWeight(int weight) { + this.weight = weight; + } + } + + static class Vertex { + private final static int infinite_dis = Integer.MAX_VALUE; + + private String name; //节点名字 + private boolean known; //此节点之前是否已知 + private int adjuDist; //此节点距离 + private Vertex parent; //当前从初始节点到此节点的最短路径下,的父节点。 + + public Vertex() + { + this.known = false; + this.adjuDist = infinite_dis; + this.parent = null; + } + + public Vertex(String name) + { + this.known = false; + this.adjuDist = infinite_dis; + this.parent = null; + this.name = name; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean isKnown() { + return known; + } + public void setKnown(boolean known) { + this.known = known; + } + public int getAdjuDist() { + return adjuDist; + } + public void setAdjuDist(int adjuDist) { + this.adjuDist = adjuDist; + } + + public Vertex getParent() { + return parent; + } + + public void setParent(Vertex parent) { + this.parent = parent; + } + + /*重新Object父类的equals方法*/ + public boolean equals(Object obj) { + if (!(obj instanceof Vertex)) { + throw new ClassCastException("要与Vertext进行比较的对象必须是Vertex"); + } + + if (this.name==null) { + throw new NullPointerException("要比较的顶点的名称不能为空"); + } + + return this.name.equals(obj); + } + } + + public void setRoot(Vertex v) + { + v.setParent(null); + v.setAdjuDist(0); + } + + + /**startIndex dijkstra遍历的起点节点下标 + * destIndex dijkstra遍历的终点节点下标 + */ + public void dijkstraTravasal(int startIndex,int destIndex) + { + Vertex start = vertexList.get(startIndex); + Vertex dest = vertexList.get(destIndex); + String path = "["+dest.getName()+"]"; + + setRoot(start); + updateChildren(vertexList.get(startIndex)); + + int shortest_length = dest.getAdjuDist(); + + while((dest.getParent()!=null)&&(!dest.equals(start))) + { + path = "["+dest.getParent().getName()+"] --> "+path; + dest = dest.getParent(); + } + + System.out.println("["+vertexList.get(startIndex).getName() +"] to ["+ + vertexList.get(destIndex).getName()+"] dijkstra shortest path :: "+path); + System.out.println("shortest length::"+shortest_length); + } + + //从初始节点开始递归更新邻接表 + private void updateChildren(Vertex v) + { + if (v==null) { + return; + } + + if (ver_edgeList_map.get(v)==null||ver_edgeList_map.get(v).size()==0) { + return; + } + //用来保存每个可达的节点 + List childrenList = new LinkedList(); + for(Edge e:ver_edgeList_map.get(v)) + { + Vertex childVertex = e.getEndVertex(); + + //如果子节点之前未知,则进行初始化, + //把当前边的开始点默认为子节点的父节点,长度默认为边长加边的起始节点的长度,并修改该点为已经添加过,表示不用初始化 + if(!childVertex.isKnown()) + { + childVertex.setKnown(true); + childVertex.setAdjuDist(v.getAdjuDist()+e.getWeight()); + childVertex.setParent(v); + childrenList.add(childVertex); + } + + //此时该子节点的父节点和之前到该节点的最小长度已经知道了,则比较该边起始节点到该点的距离是否小于子节点的长度, + //只有小于的情况下,才更新该点为该子节点父节点,并且更新长度。 + int nowDist = v.getAdjuDist()+e.getWeight(); + if(nowDist>=childVertex.getAdjuDist()) + { + continue; + } + else { + childVertex.setAdjuDist(nowDist); + childVertex.setParent(v); + } + } + + //更新每一个子节点 + for(Vertex vc:childrenList) + { + updateChildren(vc); + } + } + +} \ No newline at end of file diff --git "a/\344\275\234\344\270\232/\345\256\232\344\271\211\345\233\276/\351\202\273\346\216\245\350\241\250/TestGraph.java" "b/\344\275\234\344\270\232/\345\256\232\344\271\211\345\233\276/\351\202\273\346\216\245\350\241\250/TestGraph.java" new file mode 100644 index 0000000000000000000000000000000000000000..c7e00b19144cea88ba729ef490caffaeb573d1d7 --- /dev/null +++ "b/\344\275\234\344\270\232/\345\256\232\344\271\211\345\233\276/\351\202\273\346\216\245\350\241\250/TestGraph.java" @@ -0,0 +1,77 @@ +package Graph1; + //邻接表表示加权有向图,并利用了dijkstra求最短路径 20200340911 何灿烽 + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import Graph1.Graph.Edge; +import Graph1.Graph.Vertex; + /*测试用main方法*/ +public class TestGraph { + public static void main(String[] args) { + Vertex v1= new Vertex("v1"); + Vertex v2= new Vertex("v2"); + Vertex v3= new Vertex("v3"); + Vertex v4= new Vertex("v4"); + Vertex v5= new Vertex("v5"); + Vertex v6= new Vertex("v6"); + Vertex v7= new Vertex("v7"); + Vertex v8= new Vertex("v8"); + + List verList = new LinkedList(); + verList.add(v1); + verList.add(v2); + verList.add(v3); + verList.add(v4); + verList.add(v5); + verList.add(v6); + verList.add(v7); + verList.add(v8); + + Map> vertex_edgeList_map = new HashMap>(); + + List v1List = new LinkedList(); + v1List.add(new Edge(v1,v2,6)); + v1List.add(new Edge(v1,v4,1)); + v1List.add(new Edge(v1,v4,1)); + + List v2List = new LinkedList(); + v2List.add(new Edge(v2,v3,43)); + v2List.add(new Edge(v2,v4,11)); + v2List.add(new Edge(v2,v5,6)); + + List v3List = new LinkedList(); + v3List.add(new Edge(v3,v8,8)); + + List v4List = new LinkedList(); + v4List.add(new Edge(v4,v3,15)); + v4List.add(new Edge(v4,v5,12)); + + List v5List = new LinkedList(); + v5List.add(new Edge(v5,v3,38)); + v5List.add(new Edge(v5,v8,13)); + v5List.add(new Edge(v5,v7,24)); + + List v6List = new LinkedList(); + v6List.add(new Edge(v6,v5,1)); + v6List.add(new Edge(v6,v7,12)); + + List v7List = new LinkedList(); + v7List.add(new Edge(v7,v8,20)); + + vertex_edgeList_map.put(v1, v1List); + vertex_edgeList_map.put(v2, v2List); + vertex_edgeList_map.put(v3, v3List); + vertex_edgeList_map.put(v4, v4List); + vertex_edgeList_map.put(v5, v5List); + vertex_edgeList_map.put(v6, v6List); + vertex_edgeList_map.put(v7, v7List); + + + Graph g = new Graph(verList, vertex_edgeList_map); + g.dijkstraTravasal(0, 7); + + } +} \ No newline at end of file