์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ ์ ํ๊ด๊ณ๊ฐ ์ ์๋ ๊ทธ๋ํ ๊ตฌ์กฐ์์ ์ ๋ ฌ์ ํ๊ธฐ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Step 1. ํ์ํ ์๋ฃ๊ตฌ์กฐ ์์ฑ
Step 1-1. ๊ฐ๊ฐ์ node๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ์๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์คํธ ์์ฑ
Step 1-2. ๊ฐ๊ฐ์ node๊ฐ ๊ฐ๋ฆฌํค๋ node๋ฅผ ์ ์ฅํ๋ Map ์์ฑ
List<Integer> degrees = new ArrayList<>();
Map<Integer, List<Integer>> nextNodes = new HashMap<>();
Step 2. Edge ์ ๋ณด๋ฅผ ์ถ๊ฐ
public void addEdge(int from, int to) {
degrees.set(to, degrees.get(to) + 1);
nextNodes.get(from).add(to);
}
Step 3. ์ ๋ ฌ
public List<Integer> sort() {
List<Integer> sorted = new ArrayList<>();
Queue<Integer> readies = IntStream.range(0, SIZE).boxed()
.filter(nno -> degrees.get(nno) == 0)
.collect(Collectors.toCollection(LinkedList::new));
while (!readies.isEmpty()) {
for (int nno : nextNodes.get(readies.peek()))
if (degrees.set(nno, degrees.get(nno) - 1) == 1) readies.offer(nno);
sorted.add(readies.poll());
}
return sorted;
}
public class Topological {
private final int SIZE;
private final List<Integer> degrees = new ArrayList<>();
private final Map<Integer, List<Integer>> nextNodes = new HashMap<>();
public Topological(int size) {
this.SIZE = size;
for (int nno = 0; nno < size; nno++) {
degrees.add(nno, 0);
nextNodes.put(nno, new ArrayList<>());
}
}
public void addEdge(int from, int to) {
degrees.set(to, degrees.get(to) + 1);
nextNodes.get(from).add(to);
}
public List<Integer> sort() {
List<Integer> sorted = new ArrayList<>();
Queue<Integer> readies = IntStream.range(0, SIZE).boxed()
.filter(nno -> degrees.get(nno) == 0)
.collect(Collectors.toCollection(LinkedList::new));
while (!readies.isEmpty()) {
for (int nno : nextNodes.get(readies.peek()))
if (degrees.set(nno, degrees.get(nno) - 1) == 1) readies.offer(nno);
sorted.add(readies.poll());
}
return sorted;
}
}
๋ค์๊ณผ ๊ฐ์ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ํ์.
์ง์ ์ฐจ์์ ์ง์ถ ์ฐ๊ฒฐ ๋ ธ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
N์ node์ ๋ฒํธ D๋ ์ง์ ์ฐจ์ T๋ ๊ฐ๋ฆฌํค๋ node์ ๋ฒํธ๋ค์ด๋ค.
Node ํ์์ D = 0์ธ ๊ฒ๋ง ํ์ํ๋ค.
ํ์ฌ node 1, 7๋ฒ์ด D = 0์ด๊ธฐ ๋๋ฌธ์ ๋ node๋ฅผ ํ์ queue์ ๋ฃ๋๋ค.