一个简单拓扑排序的 java 实现
2017-07-24 15:58
866 查看
如果含有圈,不可能进行拓扑排序,在这里我们假设图中不含圈。要将下图进行拓扑:
我们计算每个顶点的入度,将所有入读为零的顶点放入初始为空的队列,当队列不为空,删除一个顶点v,并将与v邻接的所有顶点的入度均减1。只要一个顶点的入度降为0,就把该点放入队列中。排序就是顶点出队的顺序。
我们计算每个顶点的入度,将所有入读为零的顶点放入初始为空的队列,当队列不为空,删除一个顶点v,并将与v邻接的所有顶点的入度均减1。只要一个顶点的入度降为0,就把该点放入队列中。排序就是顶点出队的顺序。
import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; public class Test { //有向图的邻接矩阵表示法 static int [] [] matrix = { {1,1,1,1,0,0,0}, {0,1,0,1,1,0,0}, {0,0,1,0,0,1,0}, {0,0,1,1,0,1,1}, {0,0,0,1,1,0,1}, {0,0,0,0,0,1,0}, {0,0,0,0,0,1,1} }; static int [] indegree = new int [7]; static int [] num = new int [7]; static void topsort() { Queue<Integer> q = new LinkedList<>(); int counter = 0; for(int i = 0; i < 7; i++) if (indegree[i] == 0) q.offer(i); while( !q.isEmpty() ) { int v = q.poll(); num[v] = counter++; for(int i = 0; i < 7; i++) if(v != i && matrix[v][i] == 1 && --indegree[i] == 0) q.offer(i); } } public static void main(String [] args) { for(int i = 0; i < 7; i++) { for(int j = 0; j < 7; j++) if(matrix[j][i] == 1) indegree[i]++; indegree[i]--; } topsort(); System.out.println("各点拓扑编号:" + Arrays.toString(num)); } }
相关文章推荐
- 一个简单的Echo Server的Java实现(增强版)
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 一个简单的线程池实现(java版)
- Java多线程-一个简单的线程,实现挂起和恢复的功能
- 一个GUI的简单练习-------- Java记事本 简单实现 陆续完善中……
- 用java实现简单的网络通信,相当于一个最简单的控制台qq(附代码) 推荐
- 一个简单的Echo Server的Java实现
- 用RMI实现一个简单的实时聊天系统(java语言)
- 用java实现的一个简单web服务器程序
- 一个GUI的简单练习-------- Java记事本 简单实现 陆续完善中……
- 超简单实现一个只接收数字的类[JAVA]
- 一个简单的用JAVA实现的屏幕抓图(源代码)
- 一个简单的线程池实现(java版)
- 利用java实现一个简单的远程监控程序
- 用java实现一个简单的序列化的例子
- 一个简单词法分析器的实现代码(java实现)
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- 一个用Java实现的简单的最大堆
- 一个java实现的简单日历,采用左树右列表的方式实现,具有参考意义
- 一个简单的用JAVA实现的屏幕抓图(源代码)