编辑代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // 读取输入:
  // n: 边的数量
  // arr: 包含所有边的数组,每两个数字表示一条边的起点和终点
  const n = Number(await readline());
  const arr = (await readline()).split(" ").map(Number);

  // 创建两个Map用于记录每个节点的入度和出度
  // inMap: 记录每个节点的入度(有多少边指向该节点)
  // outMap: 记录每个节点的出度(从该节点出发有多少边)
  const inMap = new Map();
  const outMap = new Map();

  // 遍历所有边,统计每个节点的入度和出度
  for (let i = 0; i < arr.length; i += 2) {
    const a = arr[i]; // 边的起点
    const b = arr[i + 1]; // 边的终点

    // 初始化节点的入度和出度
    if (!inMap.has(a)) inMap.set(a, 0);
    if (!inMap.has(b)) inMap.set(b, 0);
    if (!outMap.has(a)) outMap.set(a, 0);
    if (!outMap.has(b)) outMap.set(b, 0);

    // 更新入度和出度
    inMap.set(b, inMap.get(b) + 1); // 终点b的入度加1
    outMap.set(a, outMap.get(a) + 1); // 起点a的出度加1
  }

  // 存储起点和终点节点
  const startNode = []; // 入度为0的节点(起点)
  const endNode = []; // 出度为0的节点(终点)

  // 检查是否存在入度为0和出度为0的节点
  // 如果不存在,说明图不满足要求,输出-1
  if (![...inMap.values()].includes(0)) return console.log(-1);
  if (![...outMap.values()].includes(0)) return console.log(-1);

  // 收集所有入度为0的节点(起点)
  inMap.forEach((val, key) => {
    if (val == 0) startNode.push(key);
  });

  // 收集所有出度为0的节点(终点)
  outMap.forEach((val, key) => {
    if (val == 0) endNode.push(key);
  });

  // 对终点节点进行降序排序
  endNode.sort((a, b) => b - a);

  // 输出结果:起点节点和终点节点,用空格分隔
  console.log(startNode.join(" ") + " " + endNode.join(" "));
})();