PT07Z

批改 作業 時間。顯然有兩個問題:
– 數據沒有從 IO 讀入讀出。
– 第一個 dfs 求出的不是最遠的端點。

不過我修改了之後目前依然沒有通過 SPOJ 的測試。支持 Javascript 的 OJ 也很少,
Codeforces 上 Javascript 的提交也遠不如其他語言。
如何在 SPOJ 提交 Javascript?這個鏈接 下面附了一個 Life, the Universe, and Everything 的 JS 標程。

let vertexLen = parseInt(readline().trim()); // 頂點數
let vertex = new Map(); // 頂點數據集合 map 可以設置鍵對值 0 1 2 3 4 5 or 1 2 3 4 5 6 or A B C D E F G ... ...

/**
 * 設置頂點
 * @param {String || Number} v 頂點
 */
const setVertex = v => vertex.set(v, []);
/**
 * 設置邊
 * @param {String || Number} v1 點
 * @param {String || Number} v2 點
 */
const setVertexEdge = (v1, v2) => {
  vertex.get(v1).push(v2);
  vertex.get(v2).push(v1);
};

// 設置點
for (let i = 1; i <= vertexLen; i++) setVertex(i);

// 定義邊
let vertexEdge = [[1, 4], [2, 4], [3, 4], [4, 5], [5, 6]];

// 設置邊
// for (let i = 0; i < vertexEdge.length; i++)
//   setVertexEdge(vertexEdge[i][0], vertexEdge[i][1]);
for (let i = 0; i < vertexLen - 1; i++) {
    var edge = readline().trim().split(" ").map(function(x) { return parseInt(x); });
    setVertexEdge(edge[0], edge[1]);
}


/**
 * dfs
 * @param {String || Number} startNode 開始點
 */
const dfs = startNode => {
  let visited = new Map(); // 保持和頂點結構一樣
  let f = startNode;
  let z = 0;
  for (let i = 1; i <= vertexLen; i++) visited.set(i, false); // 設置訪問狀態

  // dfs 方法
  const dfsFunc = (startNode, visited, dep) => {
    if (dep > z) {
        f = startNode;
        z = dep;
    }
    dep += 1;
    visited.set(startNode, true); // 第一個點設置已訪問
    let get_next = vertex.get(startNode); // 獲得頂點的所有臨接點
    for (let i = 0; i < get_next.length; i++) {
      // 循環臨接點
      let get_elem = get_next[i]; // 得到元素
      if (!visited.get(get_elem)) {
        dfsFunc(get_elem, visited, dep);
      }      
    }
    return z;
  };
  dfsFunc(startNode, visited, 0);
  return f;
};

/**
 * dfs
 * @param {String || Number} startNode 開始點
 */
const dfs1 = startNode => {
  // 記錄開始點和父級節點
  const dfsFunc = (startNode, parentNode = -1) => {
    let z = 0; // 記錄長度
    let get_next = vertex.get(startNode); // 得到相鄰節點
    for (let i = 0; i < get_next.length; i++) { // 循環點
      let get_elem = get_next[i]; // 得到點
      if (get_elem === parentNode) continue; // 如果是父節點 跳過
      z = Math.max(z, dfsFunc(get_elem, startNode) + 1); // 遞歸添加長度
    }
    return z;
  };
  return dfsFunc(startNode);
};

let z = dfs(1);

// console.log(z);

let z1 = dfs1(1);
// console.log(z1);

print(z1);

// console.log(vertex);