指令安排问题

x33g5p2x  于2022-07-22 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(430)

一 原问题链接

Batch System - HDU 4019 - Virtual Judge

https://vjudge.net/problem/HDU-4019

二 输入和输出

1 输入

输出包括几个测试用例。每个测试用例的第 1 行包含两个整数 N 和 M,表示 N 个指令和 M 个依赖关系。以下 M 行,每行都包含 3 个整数 X、Y、Z,表示 X 和 Y 的安全距离是 Z,Y 在 X 之后运行。指令编号为 0~ N-1。

2 输出

单行输出一个整数,即 CPU 运行所需要的最短时间。

三 输入和输出样例

1 输入

5 2

1 2 1

3 4 1

2 输出

2

四 分析和设计

根据测试用例,构建的图形结构如下图所示。在 1 ns 中,执行指令 0、1和3;在第 2ns 中,执行指令 2 和 4.答案是2。

按照拓扑排序求每个节点的最长距离,然后求各个节点最长距离的最大值。

五 代码

  1. package graph.hdu4109;
  2. import java.util.Scanner;
  3. import java.util.Stack;
  4. public class Hdu4109 {
  5. static final int maxn = 1005;
  6. static int map[][];
  7. static int in[];
  8. static int topo[] = new int[maxn];
  9. static int d[] = new int[maxn];
  10. static int n, m;
  11. static Stack<Integer> s = new Stack<>();
  12. static void TopoSort() { // 按拓扑排序求最长距离
  13. int cnt = 0;
  14. for (int i = 0; i < n; i++)
  15. if (in[i] == 0) {
  16. s.push(i);
  17. d[i] = 1;
  18. }
  19. while (!s.empty()) {
  20. int u = s.peek();
  21. s.pop();
  22. topo[cnt++] = u;
  23. for (int v = 0; v < n; v++) {
  24. if (map[u][v] > 0) {
  25. d[v] = Math.max(d[v], d[u] + map[u][v]);
  26. if (--in[v] == 0)
  27. s.push(v);
  28. }
  29. }
  30. }
  31. }
  32. public static void main(String[] args) {
  33. int u, v, w;
  34. while (true) {
  35. Scanner scanner = new Scanner(System.in);
  36. n = scanner.nextInt();
  37. m = scanner.nextInt();
  38. map = new int[maxn][maxn];
  39. in = new int[maxn];
  40. d = new int[maxn];
  41. for (int i = 1; i <= m; i++) {
  42. u = scanner.nextInt();
  43. v = scanner.nextInt();
  44. w = scanner.nextInt();
  45. map[u][v] = w;
  46. in[v]++;
  47. }
  48. TopoSort();
  49. int ans = 0;
  50. for (int i = 0; i < n; i++)
  51. ans = Math.max(ans, d[i]);
  52. System.out.println(ans);
  53. }
  54. }
  55. }

六 测试

绿色为输入,白色为输出。

相关文章