当前位置: 首页 > news >正文

沧州网站制作报价广州网络推广公司

沧州网站制作报价,广州网络推广公司,门户网站建设情况说明,shenz软件开发好公司拓扑排序 拓扑排序-lintcode原题题目介绍解题思路代码演示解题方法二 (参考,不用掌握)前置知识 图的拓扑序和深度优先遍历和广度优先遍历 拓扑排序-lintcode原题 127.拓扑排序-原题链接,可以点进去测试 题目介绍 描述 给定一个有向图,图节点的拓扑排序定义如下: 对…

拓扑排序

  • 拓扑排序-lintcode原题
  • 题目介绍
  • 解题思路
  • 代码演示
  • 解题方法二 (参考,不用掌握)
  • 前置知识 图的拓扑序和深度优先遍历和广度优先遍历

拓扑排序-lintcode原题

127.拓扑排序-原题链接,可以点进去测试

题目介绍

描述
给定一个有向图,图节点的拓扑排序定义如下:
对于图中的每一条有向边 A -> B , 在拓扑排序中A一定在B之前.
拓扑排序中的第一个节点可以是图中的任何一个没有其他节点指向它的节点.
针对给定的有向图找到任意一种拓扑排序的顺序.

样例:
输入:
graph = {0,1,2,3#1,4#2,4,5#3,4,5#4#5}
输出:
[0, 1, 2, 3, 4, 5]
解释:
在这里插入图片描述
拓扑排序可以为:
[0, 1, 2, 3, 4, 5]
[0, 2, 3, 1, 5, 4]

您只需要返回给定图的任何一种拓扑顺序。

解题思路

我们用图的深度优先遍历去解决这个题.
由于拓扑序不唯一,但我们可以定一个标准,深度越深的节点,拓扑序越靠前.
我们用深度优先遍历,把图节点的深度都拿到,保存在一个表中,
我们再根据深度去排序,就得到递归序了,我们上代码演示.

代码演示

1.lintcode 提供的图结构

 public static class DirectedGraphNode {public int label;public ArrayList<DirectedGraphNode> neighbors;public DirectedGraphNode(int x) {label = x;neighbors = new ArrayList<DirectedGraphNode>();}}
  1. 下面代码可以直接复制进去测试
 /*** 拓扑序* @param graph* @return*/public static ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {HashMap<DirectedGraphNode, Record> order = new HashMap<>();//拿到每个点的深度for (DirectedGraphNode node : graph){process(node,order);}//排序好的节点放进集合中  方便排序ArrayList<Record> records = new ArrayList<>();for (Record record : order.values()){records.add(record);}//使用自定义比较器去排序records.sort(new MyComparator());ArrayList<DirectedGraphNode> ans = new ArrayList<>();for (Record re : records){ans.add(re.node);}return ans;}/*** 记录每个几点的最大深度*/public static class Record{//节点DirectedGraphNode node;//深度int deep;public Record(DirectedGraphNode node, int deep) {this.node = node;this.deep = deep;}}/*** 自定义比较器,深度越深的,就排在前面.*/public static class MyComparator implements Comparator<Record>{@Overridepublic int compare(Record o1, Record o2) {return o2.deep - o1.deep;}}/*** 递归去记录每个节点的最大深度* @param node* @return*/public static Record process(DirectedGraphNode node, HashMap<DirectedGraphNode,Record>orders){//记忆化搜索,记录每次的结果,如果已经有了就直接拿结果返回.if (orders.containsKey(node)){return orders.get(node);}int deep = 0;//拿到节点最大深度for (DirectedGraphNode cur : node.neighbors){deep = Math.max(deep,process(cur,orders).deep);}Record record = new Record(node, deep + 1);orders.put(node,record);return record;}

解题方法二 (参考,不用掌握)

思路:
和方法一类似,在递归的过程中,我们不计算最大深度了,我们拿到每个点下面出现了多少次别的点.
出现点次越多的,我们认为拓扑序越靠前.
举例:
如果a点后面还有五个点,b 后面有四个点,我们认为a 的拓扑序更靠前/

直接代码展示,可以提交测试.

 /*** 排序.* @param graph* @return*/public static ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph){HashMap<DirectedGraphNode, Record> map = new HashMap<>();for (DirectedGraphNode node : graph){process(node, map);}ArrayList<Record> records = new ArrayList<>();for (Record re : map.values()){records.add(re);}records.sort(new MyComparator());ArrayList<DirectedGraphNode> directedGraphNodes = new ArrayList<>();for (Record record : records){directedGraphNodes.add(record.node);}return directedGraphNodes;}/*** 记录每个点在深度遍历时 后面点出现的点次的概念*/public static class Record{public DirectedGraphNode node;public long nodes;public Record(DirectedGraphNode node, long nodes) {this.node = node;this.nodes = nodes;}}public static class MyComparator implements Comparator<Record>{@Overridepublic int compare(Record o1, Record o2) {return o1.nodes == o2.nodes ? 0 : (o1.nodes > o2.nodes ? -1 : 1);}}/*** 递归算法 计算每个点出现的点次* @param node* @param records* @return*/public static Record process(DirectedGraphNode node, HashMap<DirectedGraphNode,Record> records){if (records.containsKey(node)){return records.get(node);}long nodes = 0;for (DirectedGraphNode cur : node.neighbors){nodes += process(cur,records).nodes;}Record record = new Record(node, nodes + 1);records.put(node,record);return record;}

前置知识 图的拓扑序和深度优先遍历和广度优先遍历

图的拓扑排序(java)

图的深度优先遍历和广度优先遍历(java)

图结构-图的数据表示法(java)

http://www.hkea.cn/news/75064/

相关文章:

  • 2023太原疫情优化设计答案大全
  • 创新的专业网站建设适合小学生的新闻事件
  • 政府机关备案网站百度竞价什么意思
  • 广元专业高端网站建设seo视频
  • 烟台网站建设诚信臻动传媒百度网络营销中心
  • 贵阳网站建设搜王道下拉重庆seo网络推广关键词
  • 大型 网站的建设 阶段百度官方网站下载
  • 江苏专业做网站的公司百度地图导航网页版
  • 怎么去投诉做网站的公司宁波seo外包推广软件
  • 网络营销跟做网站有什么区别线上推广如何引流
  • 如何进行网店推广seo排名优化怎样
  • 什么建站程序好收录上海网络公司seo
  • 电子商务网站建设投资预算小程序平台
  • 广州外贸营销型网站成都移动seo
  • 如何韩国视频网站模板下载 迅雷下载sem竞价托管费用
  • 做网站去哪个平台seo培训学院
  • 网站移动端优化的重点有哪些营销策略ppt
  • 养车网站开发搜狗seo快速排名公司
  • 企业电子商务网站建设武汉百度快速排名提升
  • 建一个网站的流程今天刚刚发生的新闻
  • 建立网站请示优化服务是什么意思
  • 有一个做场景动画的网站山东seo费用多少
  • 阿里云服务器的网站备案流程图营销推广有哪些形式
  • 做宣传用什么网站好手游推广平台有哪些
  • 免费全国网站在线客服软件新手电商运营从哪开始学
  • 0317网站建设怎么建个网站
  • 做网站做电脑版还是手机版好电话营销
  • 深圳网站建设 设计搜索引擎的工作原理是什么?
  • 在线网站设计百度收录查询方法
  • 最新体育新闻足球百度seo收费