1.拓扑排序

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列

2.实现方法

利用二维数组保存有向图,重复边过滤,有边的话map[i][j]=1,i到j存在着边,用一个indegree数组保存每个节点的入度信息,

从度为0的节点开始,入栈,若栈不为空,出栈,当前元素到其他元素若存在边,去除这条边,map[i][j]=0,此外,让边的末尾节点入度减1,若减为0,则重新入栈,并且将此顶点入度去掉

3.代码实现

package 有向图的拓扑排序;import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;/*** @Author:likui* @PacakgeName:test* @Description: 拓扑排序* 3 1 5 21 10  孩子节点* 0 3 3 1 5   父节点* 3           指定节点* @Date:Created in 9:04 2019/9/7*/public class Main {public static void way(int []x,int y[],int pos,int max){int indegree[]=new int[max];//保存每个顶点的入度信息int map[][]=new int[max][max];//保存整个有边的图for (int i = 0; i <x.length ; i++) {if (x[i]==0||y[i]==0)//去掉顶点为0的输入,过滤条件continue;else{if (map[x[i]-1][y[i]-1]==0){//保存边,重复边去掉,map[i][j]=1,说明有i到j的有向边map[x[i]-1][y[i]-1]=1;indegree[y[i]-1]++;}}}System.out.println("拓扑排序结果:");System.out.println(BFS(indegree,map,pos));}private static ArrayList<Integer> BFS(int []indegree,int[][] map,int pos) {ArrayList<Integer> list=new ArrayList<>();//保存拓扑排序Stack<Integer> stack = new Stack<>();//indegree[pos-1]=-1; //从指定位置开始进行拓扑排序for (int i = 0; i <map.length ; i++) {//去掉没有边的节点的图for (int j = 0; j <map.length ; j++) {if (map[i][j]!=0&&indegree[i]==0&&i==pos-1){stack.push(i);//将入度为0的节点入栈indegree[i] = -1;}}}/*   for (int i = 0; i < indegree.length; i++) {//整个图的拓扑排序,包含没有边的节点if (indegree[i] == 0) {stack.push(i);indegree[i] = -1;}}*/while (!stack.isEmpty()) {//若栈不为空int p = stack.pop();//出栈// count++;list.add(p+1);//访问当前元素for (int j = 0; j < indegree.length; j++) {if (map[p][j] == 1) {//当前度为0的节点到其他顶点有边map[p][j] = 0;//去掉这条边indegree[j]--;//变得末尾节点入度减1if (indegree[j] == 0) {//如果度减为0,入栈stack.push(j);indegree[j] = -1;//没有入度信息}}}}return list;}public static void main(String[] args) {Scanner sc=new Scanner(System.in);String s1=sc.nextLine();String s2=sc.nextLine();int pos=Integer.parseInt(sc.nextLine());String str1[]=s1.split(" ");String str2[]=s2.split(" ");int x[]=new int[str1.length];int y[]=new int[str2.length];int max1=Integer.MIN_VALUE;int max2=Integer.MIN_VALUE;for (int i = 0; i <x.length ; i++) {x[i]=Integer.parseInt(str2[i]);y[i]=Integer.parseInt(str1[i]);max1=Math.max(y[i],max1);max2=Math.max(x[i],max2);}max1=Math.max(max1,max2);way(x,y,pos,max1);}}

4.输出测试用例结果,0代表不存在的节点

Java实现有向图的拓扑排序相关推荐

  1. 拓扑排序之java实现_有向图和拓扑排序Java实现

    package practice; import java.util.ArrayDeque; import java.util.Iterator; import java.util.Stack; pu ...

  2. 在linux下实现拓扑排序,数据结构——有向图(拓扑排序算法)

    package zieckey.datastructure.study.graph; /** * 有方向图 * * @author zieckey */ public class DirectedGr ...

  3. 数据结构之图:有向图的拓扑排序,Python代码实现——26

    有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个 ...

  4. 有向图的拓扑排序的理解和简单实现(Java)

    如果图中存在环(回路),那么该图不存在拓扑排序,在这里我们讨论的都是无环的有向图. 什么是拓扑排序 一个例子 对于一部电影的制作过程,我们可以看成是一个项目工程.所有的工程都可以分为若干个" ...

  5. 有向图的拓扑排序算法JAVA实现

    一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常. 要想实现图的算法,如拓扑排序.最短路径--并运行看输出结果,首先就得构造一个图.由于构造图的方式有很多种,这里假 ...

  6. (数据结构)有向图的拓扑排序 Kahn算法

    拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从vi到vj的路径,那么在排序中,vi必须出现在vj的前面. 首先,我们需要准备一个vector<int> link[maxn],l ...

  7. AOV网络(有向图)----拓扑排序--判断有无环的问题--12月18日

    AOV网络 用顶点表示活动的网络 用有向图表示先修和后修的关系. 在有向图中,用顶点表示活动, 用有向边< vi, vj >表示vi 必须先于 v j进行. 如果有有向环则说明某项活动以自 ...

  8. 【vivo2021届秋季校招编程题】【java】队列实现拓扑排序

    一个完整的软件项目往往会包含很多由代码和文档组成的源文件.编译器在编译整个项目的时候,可能需要按照依赖关系来依次编译每个源文件.比如,A.cpp 依赖 B.cpp,那么在编译的时候,编译器需要先编译 ...

  9. aov建立Java模拟,数据结构之---C语言实现拓扑排序AOV图

    //有向图的拓扑排序 //杨鑫 #include #include #include #define MAX_NAME 3 #define MAX_VERTEX_NUM 20 typedef int ...

最新文章

  1. 排序算法---希尔排序(java版)
  2. windows 2008+Oracle 11g R2 故障转移群集配置
  3. 油猴脚本第一家,网页网盘链接实时判断+资源搜索网站导航,资源重度患者的福利...
  4. slider节点透明背景_【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)...
  5. 计算机系统是连续系统,连续系统的计算机模拟
  6. 《Adobe Illustrator大师班:经典作品与完美技巧赏析》—Svetlana Makarova
  7. 泸州田家炳中学2021高考成绩查询,2021年泸州中考线出来了吗
  8. Python简单实现微博自动点赞
  9. 什么是微网格?微网格规划应考虑哪些因素?
  10. cdrx8如何批量导出jpg_cdr怎么保存jpg格式
  11. word文档转换为md文档
  12. mysql修改校对集_关于MySQL字符集和校对集问题
  13. linux 3d 制作工具,3D特效制作 SideFX Houdini FX For Win/Linux/macOS 及安装教程
  14. 实验三 交互式绘制多边形
  15. 抖音号永久封禁了怎么解封
  16. 机器人让你摆脱电销压力
  17. 泰山OFFICE技术讲座:为字体调整字间距的研究,设置值何时生效
  18. Openstack 对象存储服务之争:Ceph或者Swift
  19. Python基础学习1
  20. FL Studio21版本水果全新功能介绍AI编曲时代或将来临

热门文章

  1. mysql 查询排行_通过mysql查询排行榜
  2. python练手程序_100个python练手小程序
  3. linux里的挂载错误无法开机怎么办,Linux基础知识 - 开机挂载错误
  4. 八、日志分析系统Nginx,Beats,Kibana和Logstash
  5. 二十九、Java的异常处理
  6. 第一行冻结_EXCEL函数tips(4) 数据冻结和查找
  7. 今日arXiv精选 | 11篇ICCV 2021最新论文
  8. 深度学习工具那么多,究竟哪款最适合你?| 线下沙龙 × 报名
  9. 复旦大学肖仰华教授:知识图谱与认知智能 | 附PPT下载
  10. Java基础:HashMap的用法