家族树问题

x33g5p2x  于2022-07-19 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(457)

一 原问题链接

Genealogical tree - POJ 2367 - Virtual Judge

https://vjudge.net/problem/POJ-2367

二 输入和输出

1 输入

第1行包括整数N,表示火星理事会的成员数。接下来的 N 行,第 i 行包含第 i 个成员的孩子名单。孩子名单可能是空的,名单以 O 结尾。

2 输出

单行输出一系列发言者的编号,用空格分隔。如果有几个序列满足条件,则输出任意一个这样的序列。

三 输入和输出样例

1 输入样例

5

0

4 5 1 0

1 0

5 3 0

3 0

2 输出样例

2 4 5 3 1

四 分析

根据输入样例,构建的图形结构如下图所示,其拓扑序列为 2 4 5 3 1。本问题属于拓扑排序问题,输出拓扑序列即可。

五 代码

  1. package graph.poj2367;
  2. import java.util.Scanner;
  3. import java.util.Stack;
  4. public class Poj2367 {
  5. static final int maxn = 105;
  6. static int map[][] = new int[maxn][maxn];
  7. static int indegree[] = new int[maxn];
  8. static int topo[] = new int[maxn];
  9. static int n;
  10. static Stack<Integer> s = new Stack<>();
  11. static void TopoSort() { // 拓扑排序
  12. int cnt = 0;
  13. for (int i = 1; i <= n; i++)
  14. if (indegree[i] == 0)
  15. s.push(i);
  16. while (!s.empty()) {
  17. int u = s.peek();
  18. s.pop();
  19. topo[++cnt] = u;
  20. for (int j = 1; j <= n; j++)
  21. if (map[u][j] == 1)
  22. if (--indegree[j] == 0)
  23. s.push(j);
  24. }
  25. }
  26. public static void main(String[] args) {
  27. Scanner scanner = new Scanner(System.in);
  28. n = scanner.nextInt();
  29. for (int i = 1; i <= n; i++) {
  30. int v;
  31. while (true) {
  32. v = scanner.nextInt();
  33. if (v == 0) {
  34. break;
  35. }
  36. map[i][v] = 1;
  37. indegree[v]++;
  38. }
  39. }
  40. TopoSort();
  41. for (int i = 1; i < n; i++)
  42. System.out.print(topo[i] + " ");
  43. System.out.println(topo[n]);
  44. }
  45. }

六 测试

相关文章