|
@@ -125,7 +125,7 @@ public class GraphService {
|
|
|
//获取无向非带权图的深度优先遍历
|
|
//获取无向非带权图的深度优先遍历
|
|
|
public GraphTraversalVO getDepthFirstTraversal(UDUWGraph graph,int startVertex){
|
|
public GraphTraversalVO getDepthFirstTraversal(UDUWGraph graph,int startVertex){
|
|
|
int nodeNum=graph.getNodeNum();
|
|
int nodeNum=graph.getNodeNum();
|
|
|
- ArrayList<ArrayList<Integer>> content=new ArrayList<ArrayList<Integer>>();
|
|
|
|
|
|
|
+ ArrayList<ArrayList<Integer>> content=graph.getContent();
|
|
|
GraphTraversalVO graphTraversalVO =new GraphTraversalVO();
|
|
GraphTraversalVO graphTraversalVO =new GraphTraversalVO();
|
|
|
graphTraversalVO.setGraph(graph);
|
|
graphTraversalVO.setGraph(graph);
|
|
|
ArrayList<GraphTraversalStep> steps=new ArrayList<GraphTraversalStep>();
|
|
ArrayList<GraphTraversalStep> steps=new ArrayList<GraphTraversalStep>();
|
|
@@ -157,41 +157,111 @@ public class GraphService {
|
|
|
for (int i = 0; i < nodeNum; i++) {
|
|
for (int i = 0; i < nodeNum; i++) {
|
|
|
if (content.get(curVertex).get(i) == 1) {
|
|
if (content.get(curVertex).get(i) == 1) {
|
|
|
if (visited.get(i) == 0) {
|
|
if (visited.get(i) == 0) {
|
|
|
|
|
+ steps.add(new GraphTraversalStep("tryRoad",curVertex,i,true));
|
|
|
nextNode = i;
|
|
nextNode = i;
|
|
|
|
|
+ steps.add(new GraphTraversalStep("visit",curVertex,i,true));
|
|
|
visited.set(nextNode, 1);
|
|
visited.set(nextNode, 1);
|
|
|
visitSequence.add(nextNode);
|
|
visitSequence.add(nextNode);
|
|
|
stack.push(nextNode);
|
|
stack.push(nextNode);
|
|
|
isTerminal = false;
|
|
isTerminal = false;
|
|
|
break;
|
|
break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ steps.add(new GraphTraversalStep("tryRoad",curVertex,i,false));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if(isTerminal){
|
|
if(isTerminal){
|
|
|
formerNode=stack.pop();
|
|
formerNode=stack.pop();
|
|
|
|
|
+ steps.add(new GraphTraversalStep("return",curVertex,stack.peek(),true));
|
|
|
}
|
|
}
|
|
|
}else{ //如果在折返状态中
|
|
}else{ //如果在折返状态中
|
|
|
if(formerNode<nodeNum-1) {
|
|
if(formerNode<nodeNum-1) {
|
|
|
boolean needReturn=true;
|
|
boolean needReturn=true;
|
|
|
for (int i = formerNode + 1; i < nodeNum; i++) {
|
|
for (int i = formerNode + 1; i < nodeNum; i++) {
|
|
|
- if(visited.get(i)==0){
|
|
|
|
|
- stack.push(i);
|
|
|
|
|
- visited.set(i,1);
|
|
|
|
|
- visitSequence.add(i);
|
|
|
|
|
- needReturn=false;
|
|
|
|
|
- break;
|
|
|
|
|
|
|
+ if(content.get(curVertex).get(i)==1) {
|
|
|
|
|
+ if (visited.get(i) == 0) {
|
|
|
|
|
+ steps.add(new GraphTraversalStep("tryRoad",curVertex,i,true));
|
|
|
|
|
+ steps.add(new GraphTraversalStep("visit",curVertex,i,true));
|
|
|
|
|
+ stack.push(i);
|
|
|
|
|
+ visited.set(i, 1);
|
|
|
|
|
+ visitSequence.add(i);
|
|
|
|
|
+ needReturn = false;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ steps.add(new GraphTraversalStep("tryRoad",curVertex,i,false));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if(needReturn){
|
|
if(needReturn){
|
|
|
formerNode=stack.pop();
|
|
formerNode=stack.pop();
|
|
|
|
|
+ if(!stack.isEmpty()) {
|
|
|
|
|
+ steps.add(new GraphTraversalStep("return", curVertex, stack.peek(), true));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ }else{ //如果当前分支就是最大分支了,则不用探路直接折返
|
|
|
|
|
+ formerNode=stack.pop();
|
|
|
|
|
+ steps.add(new GraphTraversalStep("return",curVertex,stack.peek(),true));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- return null;
|
|
|
|
|
|
|
+ graphTraversalVO.setContent(steps);
|
|
|
|
|
+ return graphTraversalVO;
|
|
|
}
|
|
}
|
|
|
//获取无向带权图的prim算法的最小生成树
|
|
//获取无向带权图的prim算法的最小生成树
|
|
|
- public PrimMinimumSpanningTree getPrimMinimumSpanningTree(UDUWGraph graph,int startVertex){
|
|
|
|
|
- return null;
|
|
|
|
|
|
|
+ public PrimMinimumSpanningTree getPrimMinimumSpanningTree(UDWGraph graph,int startVertex){
|
|
|
|
|
+ ArrayList<ArrayList<Integer>> content=graph.getContent();
|
|
|
|
|
+ int nodeNum=content.size();
|
|
|
|
|
+ ArrayList<Integer> cost=new ArrayList<Integer>();
|
|
|
|
|
+ ArrayList<Boolean> known=new ArrayList<Boolean>();
|
|
|
|
|
+ ArrayList<Integer> startNode=new ArrayList<Integer>();
|
|
|
|
|
+ ArrayList<ArrayList<Integer>> treeEdges=new ArrayList<ArrayList<Integer>>();
|
|
|
|
|
+ ArrayList<Integer> knownSequence=new ArrayList<Integer>();
|
|
|
|
|
+ ArrayList<GraphTraversalStep> steps=new ArrayList<GraphTraversalStep>();
|
|
|
|
|
+ PrimMinimumSpanningTree primMinimumSpanningTree=new PrimMinimumSpanningTree();
|
|
|
|
|
+ for(int i=0;i<nodeNum;i++){
|
|
|
|
|
+ cost.add(Integer.MAX_VALUE);
|
|
|
|
|
+ known.add(false);
|
|
|
|
|
+ startNode.add(-1);
|
|
|
|
|
+ }
|
|
|
|
|
+ cost.set(startVertex,0);
|
|
|
|
|
+ while(knownSequence.size()<nodeNum){ //还有节点没有被连接
|
|
|
|
|
+ int min=Integer.MAX_VALUE;
|
|
|
|
|
+ int indexOfMin=-1;
|
|
|
|
|
+ for(int i=0;i<nodeNum;i++){
|
|
|
|
|
+ if(known.get(i)==false){ //在没有被连接的节点中选一个代价最小的节点
|
|
|
|
|
+ if(cost.get(i)<min){
|
|
|
|
|
+ indexOfMin=i;
|
|
|
|
|
+ min=cost.get(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ steps.add(new GraphTraversalStep("selectMin",indexOfMin,-1,true));
|
|
|
|
|
+ steps.add(new GraphTraversalStep("setKnown",indexOfMin,-1,true));
|
|
|
|
|
+ known.set(indexOfMin,true); //连接这个节点,并遍历它周围的节点,若代价更小,则将代价和前驱节点替换
|
|
|
|
|
+ knownSequence.add(indexOfMin);
|
|
|
|
|
+ for(int i=0;i<nodeNum;i++){
|
|
|
|
|
+ if(content.get(indexOfMin).get(i)>0){ //如果有边可以到达的话
|
|
|
|
|
+ steps.add(new GraphTraversalStep("tryRoad",indexOfMin,i,true));
|
|
|
|
|
+ if(content.get(indexOfMin).get(i)<cost.get(i)){ //如果代价更小,需要替换
|
|
|
|
|
+ cost.set(i,content.get(indexOfMin).get(i));
|
|
|
|
|
+ startNode.set(i,indexOfMin);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ for(int i=0;i<nodeNum;i++){
|
|
|
|
|
+ if(i!=startVertex){
|
|
|
|
|
+ ArrayList<Integer> edge=new ArrayList<Integer>();
|
|
|
|
|
+ edge.add(startNode.get(i));
|
|
|
|
|
+ edge.add(i);
|
|
|
|
|
+ treeEdges.add(edge);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ primMinimumSpanningTree.setSteps(steps);
|
|
|
|
|
+ primMinimumSpanningTree.setTreeEdges(treeEdges);
|
|
|
|
|
+
|
|
|
|
|
+ return primMinimumSpanningTree;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|