C++ :: Topological Sort Algorithm (using INDEGREE)
A topological sort of a dag G = (V,E) is a linear ordering of all its vertices such that if G contains an edge (u,v), then u appears before v in the ordering. (If the graph contains a cycle, then no linear ordering is possible.)
ALGORITHM
TOPOLOGICAL-SORT(S)
Find the indegree INDEG(N) of each node N of S. (This can be done by traversing each adjacency matrix.)
Put in a queue all the nodes with zero indegree.
Repeat Steps 5 and 6 until the queue is empty.
Remove the front node N of the queue.
Repeat the following for each neighbor M of the node N:
(a) Set INDEG(M) := INDEG(M) - 1.
[This deletes the edge from N to M.]
(b) If INDEG(M) = 0, then: Add M to the rear of the queue.
[End of loop.]
[End of Step 3 loop.]
Exit.

C++ Code
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#define MAX 101
using namespace std;
int INDEG[MAX], node, edge;
vector<int> TOPOLOGICAL_SORT(int [][MAX]);
int main(void)
{
//freopen("toposort.txt", "r", stdin);
int adjMatrix[MAX][MAX];
for(int i=0; i<MAX; i++)
for(int j=0; j<MAX; j++) {
adjMatrix[i][j] = 0;
INDEG[i] = 0;
}
int M, N;
cin >> node >> edge;
for(int e=1; e<=edge; e++) {
cin >> M >> N;
adjMatrix[M][N] = 1;
INDEG[N]++;
}
vector<int> orderedList = TOPOLOGICAL_SORT(adjMatrix);
for(int i=0; i<orderedList.size(); i++) {
cout << orderedList[i] << ends;
}
return 0;
}
vector<int> TOPOLOGICAL_SORT(int S[][MAX]) {
queue<int> Q;
for(int n=1; n<=node; n++) {
if(INDEG[n] == 0) Q.push(n);
}
vector<int> topoList;
while( !Q.empty()) {
int N = Q.front(); Q.pop();
topoList.push_back(N);
for(int M=1; M<=node; M++) {
if(S[N][M] == 1) {
INDEG[M]--;
if(INDEG[M] == 0) {
Q.push(M);
}
}
}
}
return topoList;
}
Sample Input
5 4 1 2 2 3 1 3 1 5
Sample Output
1 4 2 5 3
Topological Sort Related UVa Problems
- 124 - Following orders
- 196 - Spreadsheet
- 200 - Rare Order
- 872 – Ordering
- 10305 - Ordering Tasks
- 11060 – Beverages
Refference: Data Structures - Seymour Lipschutz