批改 作業 時間。顯然有兩個問題:
– 數據沒有從 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);