您的位置:首页 > 编程语言 > Java开发

拓扑排序 java

2015-07-30 15:32 477 查看
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.Set;

/**
* A->B A->E D->B B->C
*
* */
public class TopoSort {

public static void main(String[] args) {
Map> graph = new HashMap<>();
graph.put("a", new ArrayList());
graph.put("d", new ArrayList());
graph.put("b", new ArrayList());
graph.get("a").add("b");
graph.get("a").add("e");
graph.get("d").add("b");
graph.get("b").add("c");
//graph.get("b").add("d");  加上去掉注释就会因为有环,抛出异常
Queue queue=topoSort(graph);
while(!queue.isEmpty())
System.out.println(queue.remove());

}

//拓扑排序
static Queue topoSort(Map> graph)throws RuntimeException {
Queue queue = new LinkedList<>();
Set vertexSet = new HashSet<>();
// 求vertexSet
for (Entry> entry : graph.entrySet()) {
vertexSet.add(entry.getKey());
for (String toVertex : entry.getValue())
vertexSet.add(toVertex);
}
Map inDegree = new HashMap<>();
// 初始化所有顶点入度为0
for (String vertex : vertexSet)
inDegree.put(vertex, 0);
// 计算各顶点的入度
for (Entry> entry : graph.entrySet())
for (String toVertex : entry.getValue())
inDegree.put(toVertex, inDegree.get(toVertex) + 1);
//拓扑排序
for (int i = 0; i < vertexSet.size(); i++) {
int j=0;
for (Entry entry : inDegree.entrySet()) {
j++;
if (entry.getValue() == 0) {
//已找过的要标记
entry.setValue(-1);
queue.add(entry.getKey());
if(graph.get(entry.getKey())!=null)
for (String toVertex : graph.get(entry.getKey()))
inDegree.put(toVertex, inDegree.get(toVertex) - 1);
break;//inDegree信息有变化,跳出去重新找
}
if(j== inDegree.entrySet().size())
throw new RuntimeException("该图有环,不能得到有序的拓扑");
}
}
return queue;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: