拓扑排序 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; } }
相关文章推荐
- JAVA对象属性复制
- java 遍历map 方法 集合 五种的方法
- 深入理解java虚拟机-1 内存结构与OutOfMemory溢出异常
- Java中单元测试中:@BeforeClass,@Before,@Test,@After,@AfterClass
- java 设计模式 -- 责任链模式
- ubuntu中检查jdk的安装路径
- springmvc运行流程图
- 【JAVA】java中CountDownLatch的用法,实例讲解
- 【转】Java HashMap的死循环
- 003--struts2原理
- java技巧之我要关窗口
- Java compiler level does not match解决方法
- 秘Java虚拟机——内存管理与垃圾回收
- Java中int类型和tyte[]之间转换及byte[]合并
- CMD下编译运行Java包文件
- 细小知识点之Spring
- eclipse的快捷键--收藏
- 为什么java局部变量没有初始化就会报错,而成员变量没有初始化就不会报错?
- eclipse中启动项目报内存溢出问题通过修改配置解决
- Java构造函数链