[C , C++]
C++ 위상 정렬 - 연결리스트, 스택
말하는펭귄
2021. 1. 19. 12:25
728x90
반응형
코드 출처
C++로 쉽게 풀어쓴 자료구조 11장
class Node {
int id; //정점의 id
Node* link; //다음 노드의 포인터
public:
Node(int i, Node* l = NULL): id(i),link(l) {}
int getId() { return id; }
Node* getLink() { return link; }
};
int vertices[1000]; //정점 배열
Node* adj[1000]; //각 정점의 인접리스트
int inDeg[1000]; //정점의 진입차수
void insertEdge(int u, int v) {
adj[u] = new Node(v, adj[u]);
}
void TopoSort() {
//모든 정점의 진입 차수 계산
for (int i = 0; i < N; i++) { //초기화
inDeg[i] = 0;
}
for (int i = 0; i < N; i++) { //정점 i에서 나오는 간선의 수 세기
Node* node = adj[i];
while (node != NULL) {
inDeg[node->getId()]++;
node = node->getLink();
}
}
//진입차수가 0인 정점 스택에 삽입
stack<int> stack;
for (int i = 0; i < N; i++) {
if (inDeg[i] == 0) {
stack.push(i);
}
}
//위상정렬 순서 생성
while (!stack.empty()) {
int w = stack.top();
cout << w << " "; //정점 출력
stack.pop();
Node* node = adj[w];
while (node != NULL) {
int u = node->getId();
inDeg[u]--; //w와 인접하는 모든 정점의 진입차수 감소
if (inDeg[u] == 0) { //진입차수 0인 정점 스택에 push
stack.push(u);
}
node = node->getLink();
}
}
}
참고
벡터, 큐 사용 위상정렬
2021/01/19 - [[백준 알고리즘]] - 2623번 음악프로그램 | Baekjoon BOJ 백준 2623 C++ 코드, 해설, 풀이
2623번 음악프로그램 | Baekjoon BOJ 백준 2623 C++ 코드, 해설, 풀이
이번 포스팅은 백준 2623번 음악프로그램입니다. 아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다. www.acmicpc.net/problem/2623 2623번: 음악프로그램 첫째 줄에는 가수의 수 N과 보조 PD의
scarlettb.tistory.com
728x90
반응형