간선을 없앴을 떄 두 개 또는 그 이상으로 나누어지는 간선
나는 위의 구하는 값이 => 사이클에 포함되지 않은 노드의 간선 과 동일하다고 생각했고 구현했다.
사이클을 판별하고 사이클에 사용된 노드의 인접리스트를 빈배열로 만들어 주는 것을 반복하여 남아있는 리스트의 개수와 리스트를 담고있는 idx와 리스트를 이용해서 간선을 출력해주면 된다고 생각했다.
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const [v, e] = input[0].split(" ").map(Number);
const graph = Array.from({ length: v + 1 }, () => []);
for (let i = 1; i <= e; i++) {
const [a, b] = input[i].split(" ").map(Number);
graph[a].push(b);
graph[b].push(a);
}
// console.log(graph);
let cycle = [];
const visited = new Array(v + 1).fill(false);
for (let i = 1; i <= v; i++) {
if (!visited[i]) {
dfs(i, 0);
}
}
function dfs(cur, prev) {
visited[cur] = true;
cycle.push(cur);
for (const next of graph[cur]) {
if (!visited[next]) {
dfs(next, cur);
}
// 방문한적이 있는데 직전노드가 아니라면 사이클
else if (next !== prev) {
const idx = cycle.findIndex((v) => v === prev);
cycle.slice(idx - 1).forEach((idx) => (graph[idx] = []));
cycle = [];
// console.log(graph);
}
}
return cycle;
}
let cnt = 0,
ans = [];
graph.forEach((v, src) => {
for (const dest of v) {
cnt++;
ans.push(src > dest ? dest + " " + src : src + " " + dest);
}
});
console.log(cnt);
console.log([...new Set(ans)].join("\n"));
근데 틀렸다..... 구글링했을떄도 비슷한 풀이들인것 같은데 JS 억까를 당하고있는것 같다 매우 화가 난다,,,,,,,,,rotlqkf