๐Ÿ“Œ About

topological sort gif.gif

์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ์„ ํ›„๊ด€๊ณ„๊ฐ€ ์ •์˜๋œ ๊ทธ๋ž˜ํ”„ ๊ตฌ์กฐ์—์„œ ์ •๋ ฌ์„ ํ•˜๊ธฐ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๐Ÿ“Œ Algorithm

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;
}

๐Ÿ“Œ Java Code

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;
    }
}

๐Ÿ“Œ Example

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

Untitled

์ง„์ž… ์ฐจ์ˆ˜์™€ ์ง„์ถœ ์—ฐ๊ฒฐ ๋…ธ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Untitled

N์€ node์˜ ๋ฒˆํ˜ธ D๋Š” ์ง„์ž…์ฐจ์ˆ˜ T๋Š” ๊ฐ€๋ฆฌํ‚ค๋Š” node์˜ ๋ฒˆํ˜ธ๋“ค์ด๋‹ค.

Node ํƒ์ƒ‰์€ D = 0์ธ ๊ฒƒ๋งŒ ํƒ์ƒ‰ํ•œ๋‹ค.

ํ˜„์žฌ node 1, 7๋ฒˆ์ด D = 0์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘ node๋ฅผ ํƒ์ƒ‰ queue์— ๋„ฃ๋Š”๋‹ค.