为什么80%的码农都做不了架构师?>>>   

1. 拓扑排序问题(HDU 1285)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;public class Main
{static int[] inDegree = new int[502];static int[][] v = new int[502][502];static boolean[] contain = new boolean[502];public static void main(String[] args) throws IOException{StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));int n, m;while (in.nextToken() != StreamTokenizer.TT_EOF){n = (int) in.nval;in.nextToken();m = (int) in.nval;init(n);for (int i = 1; i <= m; i++){in.nextToken();int p1 = (int) in.nval;in.nextToken();int p2 = (int) in.nval;if(v[p1][p2] == 0){inDegree[p2]++;}v[p1][p2] = 1;}topologicalOrder(n);System.out.println();}}private static void topologicalOrder(int n){// TODO Auto-generated method stubint vv;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (inDegree[j] == 0 && contain[j]){vv = j;contain[vv] = false;for (int j2 = 1; j2 <= n; j2++){if (v[vv][j2] > 0){inDegree[j2]--;}}System.out.print(vv);if(i != n){System.out.print(" ");}break;}}}}private static void init(int n){// TODO Auto-generated method stubfor (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){v[i][j] = 0;}inDegree[i] = 0;contain[i] = true;}}}

上述代码就是最简单的拓扑排序,里面有很多可以优化的地方,比如用如果数据稀疏的话可以用邻接表来代替二维数组(矩阵),在找编号最小的且度为0的顶点,可以使用最小堆( 优先队列)。下面代码使用优先队列来代替原本的遍历查找,使复杂度降低。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.PriorityQueue;
import java.util.Queue;public class Main
{static int[] inDegree = new int[502];static int[][] v = new int[502][502];public static void main(String[] args) throws IOException{StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));int n, m;while (in.nextToken() != StreamTokenizer.TT_EOF){n = (int) in.nval;in.nextToken();m = (int) in.nval;init(n);for (int i = 1; i <= m; i++){in.nextToken();int p1 = (int) in.nval;in.nextToken();int p2 = (int) in.nval;if (v[p1][p2] == 0){inDegree[p2]++;}v[p1][p2] = 1;}topologicalOrder(n);System.out.println();}}private static void topologicalOrder(int n){// TODO Auto-generated method stubint vv;Queue<Integer> queue = new PriorityQueue<Integer>();for (int i = 1; i <= n; i++){if (inDegree[i] == 0){queue.add(i);}}for (int i = 1; i <= n; i++){vv = queue.poll();for (int j2 = 1; j2 <= n; j2++){if (v[vv][j2] > 0){inDegree[j2]--;if (inDegree[j2] == 0){queue.add(j2);}}}System.out.print(vv);if (i != n){System.out.print(" ");}}}private static void init(int n){// TODO Auto-generated method stubfor (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){v[i][j] = 0;}inDegree[i] = 0;}}}

直接把入度为0的顶点放到优先队列中(普通的拓扑排序只用普通队列/栈/数组即可,这里题目中有要求,相同入度为0的点要求序号小的先输出,所以使用优先队列),使用队列减少了一遍遍的遍历所有点的入度。

在使用BFS和Dijkstra的优先队列中都要使用到队列,关于Dijkstra以及最短路径算法,请查看最短路径算法

系列:

【算法系列 一】 Linked List

【算法系列 二】 Stack

【算法系列 三】 Quene

【算法系列 四】 String

转载于:https://my.oschina.net/hosee/blog/626582

【算法系列 三】 Quene相关推荐

  1. 经典算法系列三----堆排序

    花了些时间好好看了堆排序的内容,代码也敲了,现在来总结一下. 为了说明白点,有些图片我就从网上截取了. 首先是堆的概念. 数据结构中的堆,又叫二叉堆 一般用数组来表示堆得结构,或者说是把堆数组化.举个 ...

  2. 【python算法系列三】 希尔排序算法

    希尔排序,又叫"缩小增量排序",是对插入排序进行优化后产生的一种排序算法.它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增 ...

  3. 【算法系列 二】Stack

    为什么80%的码农都做不了架构师?>>>    栈应用的场景: 1.括号问题 2.后缀表达式 3.深度优先遍历 4.保存现场 1. 给定字符串,仅由"()[]{}" ...

  4. 狼羊菜过河问题c语言算法,算法系列之十四:狼、羊、菜和农夫过河问题

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  5. 算法系列之十四:狼、羊、菜和农夫过河问题

    算法系列之十四:狼.羊.菜和农夫过河问题 题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷 ...

  6. 【Python算法系列十一】二叉树的3种遍历方式

    二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次. 遍历二叉树的方法主要分 3 种:先序遍历.中序遍历和后序遍历: 先序遍历指最先遍历节点本身, ...

  7. 三白话经典算法系列 Shell排序实现

    山是包插入的精髓排序排序,这种方法,也被称为窄增量排序.因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元 ...

  8. 数据与广告系列三十二:重排ReRank,广告推荐算法链路上的背叛者,生态系统格局的重塑者...

    作者·黄崇远 『数据虫巢』 全文23138字 题图ssyer.com " 在推荐系统又或者计算广告中,重排ReRank明目张胆的把召回.粗排.精排几个链路逻辑辛苦生成的序给打乱,但却敢号称是 ...

  9. 某酷ckey签名生成算法系列--(三)ast代码控制流平坦化

    某酷ckey签名生成算法系列--(三)ast代码控制流平坦化 观察三个switch的值分别是Ci.mi和Ai.而这三个值又因为li的确定而确定的.也就是说已知li的值,就可以分别计算出Ci.mi和Ai ...

最新文章

  1. WindowsXP中修改本地路由表
  2. 模拟namenode挂掉利用secondary namenode恢复
  3. leetcode:Sort List(一个链表的归并排序)
  4. 路由器的×××流量过滤
  5. mysql 5.7 循环语句_MySQL循环语句|mysql|loop|delimiter|procedure|调用_网易订阅
  6. sqlserver数据库大型应用解决方案总结 数据库负载均衡
  7. Angular实现图片点击缩放组件
  8. 三维图像处理_【图像处理】用于三维物体检测的三维骨干网络
  9. django之开发环境关于settins.py里面的DEBUG的设置和静态文件的关系
  10. IP网络中的路由聚合的解析
  11. 关于在windows上首次编译运行pbrt-3
  12. 基于Java实现的绘图软件工具设计
  13. linux游戏掌机,一起来猎奇:窄众平板/游戏掌机推荐
  14. Kruskal(克鲁斯卡尔)
  15. 国际版抖音加群 振兴中华
  16. 如何恢复计算机中被隐藏的文件夹,电脑中病毒后,文件与文件夹被隐藏,如何恢复正常显示。...
  17. eNSP网络仿真软件配置局域网vlan
  18. php日期去掉分秒,Phpcms教程:解决内容页去掉发布时间的小时,分秒问题
  19. STM32F103+DHT11模块+DS18B20模块 显示实时温湿度并高温高湿报警
  20. win7c盘空间越来越小_C盘空间越来越小原因

热门文章

  1. python中的repr是什么意思_理解Python中的repr()函数
  2. 人工智能如何才能工程化?
  3. 海康威视linux密码忘记,Hikvision DS-2CD7153-E 网络摄像机远程缓冲区溢出漏洞(CVE-2013-4977)...
  4. 统计学—假设检验之Z检验,T检验
  5. 制作自己的Linux系统与启动光盘(2)
  6. grom err整理
  7. [芯片笔记] W25Qx芯片的标准SPI读写
  8. OpenLDAP 最详细的概念教程
  9. angular2概述
  10. Angular 2 核心模块详解