breadth-first search
package com.ygy.test.sort;
import lombok.Getter;
import lombok.Setter;
import org.springframework.util.CollectionUtils;
import java.util.*;
/**
* Created by guoyao on 2017/10/11.
*/
public class TopologicalSorting {
private static class Vertex {
@Getter @Setter
private int indegree;
@Getter @Setter
private String name ;
@Getter @Setter
private int deepPath = Integer.MIN_VALUE ;
@Getter @Setter
private Boolean isKnown = false ;
@Getter @Setter
private Vertex preShortVertex ;
public boolean isKnown () {
return isKnown ;
}
public Vertex (String name) {
this .name=name;
indegree = 0 ;
}
@Override
public boolean equals (Object o) {
if (this == o) return true ;
if (o == null || getClass() != o.getClass()) return false ;
Vertex vertex=(Vertex) o;
return name.equals(vertex.name);
}
@Override
public int hashCode () {
return name.hashCode();
}
}
private static class TopoGraph {
public Map<Vertex, Set<Vertex>> relMap=new HashMap<>();
public Set<Vertex> vertices=new HashSet<>();
public boolean addRelVertex (Vertex start, Vertex end) {
vertices.add(start);
vertices.add(end);
Set<Vertex> adjcents=relMap.get(start);
if (CollectionUtils.isEmpty(adjcents)) {
adjcents = new HashSet<>();
}
if (adjcents.contains(end)) {
return false ;
}
adjcents.add(end);
int indegree=end.getIndegree();
end.setIndegree(++indegree);
relMap.put(start, adjcents);
return true ;
}
}
public static List<Vertex> bfs_sort (TopoGraph topoGraph, Vertex firstRoot) {
Queue<Vertex> knownQueue=new LinkedList<>();
List<Vertex> resultList=new ArrayList<>();
firstRoot.setDeepPath(0 );
firstRoot.setIsKnown(true );
knownQueue.add(firstRoot);
while (!knownQueue.isEmpty()) {
Vertex knownVertex=knownQueue.poll();
resultList.add(knownVertex);
Set<Vertex> adjacents=topoGraph.relMap.get(knownVertex);
if (!CollectionUtils.isEmpty(adjacents)) {
for (Vertex adj : adjacents) {
if (!adj.isKnown()) {
adj.setDeepPath(knownVertex.getDeepPath() + 1 );
adj.setIsKnown(true );
adj.setPreShortVertex(knownVertex);
knownQueue.add(adj);
}
}
}
}
return resultList;
}
public static void printShortPath (List<Vertex> list) {
if (CollectionUtils.isEmpty(list)) {
return ;
}
for (Vertex vertex : list) {
int count = 0 ;
while (vertex != null ) {
if (count != 0 ) {
System.out.print("<----" );
}
System.out.print(vertex.getName()+ ":" + vertex.getDeepPath());
vertex = vertex.preShortVertex;
count ++ ;
}
System.out.println();
}
}
if (count != resultList.size()) {
throw new RuntimeException(" 闭环" );
}
return resultList;
}
public static void main (String[] args) throws Exception {
Vertex vertexA=new Vertex("A" );
Vertex vertexB=new Vertex("B" );
Vertex vertexC=new Vertex("C" );
Vertex vertexD=new Vertex("D" );
Vertex vertexE=new Vertex("E" );
TopoGraph topoGraph=new TopoGraph();
topoGraph.addRelVertex(vertexA, vertexB);
topoGraph.addRelVertex(vertexA, vertexC);
topoGraph.addRelVertex(vertexC, vertexD);
topoGraph.addRelVertex(vertexB, vertexD);
topoGraph.addRelVertex(vertexB, vertexE);
topoGraph.addRelVertex(vertexD, vertexE);
List<Vertex> vertices=bfs_sort(topoGraph, vertexA);
printShortPath(vertices);
}
}