I am trying to solve a problem based on TopSort. Since there will be a number of valid topological sorted orderings, I need to output the one which is lexicographically the smallest, i.e. Smallest-numbered available vertex first.
I will explain the method I have adopted, then post the code. I have maintained an array which contains the number of in-edges for each node of the graph. An adjacency matrix is also present. I have a boolean array 'visited' which keeps a count of visited nodes, and a minimum priority queue to pop out the smallest available vertex at that moment. Here is my code:
void dfs(int u){
visited[u] = true;
cout<<u<<" ";
list<int>::iterator i;
for(i = adj[u].begin(); i != adj[u].end(); ++i){
if(!visited[*i]){
inedge[*i]--;
if(!inedge[*i]){
pq.push(*i);
}
if(!pq.empty()){
int temp = pq.top();
pq.pop();
dfs(temp);
}
}
}
}
Now, at the first call of this function, the priority queue contains only those nodes for which inedge[i]=0 (number of in-edges is zero). I pop out the minimum node from that priority queue u = pq.top()
, and call dfs(u)
.
But my code is giving wrong outputs. Can anybody help me out if the logic I used here is wrong?
My input consists of N incomplete sequences (with missing numbers in each of the N). Input:
2
1 3
2 3 4
Output:
1 2 3 4
This is the correct expected output, and my code does generate this. But for an input given in this image Input:
6
7 8 9
7 11 9
5 11 2
3 8 9
11 10
3 10
expected output is :
3 5 7 8 11 2 9 10
My code outputs :
3 5 7 8 11 9 2 10
My code outputs wrong results for a few other test cases as well, but I do not know how to solve this issue.
The problem seems to be that pq.top
is called before all outgoing edges of the current node have been checked.
Consider the following graph: Nodes: A, B, C; Edges A->B, A-C. Let C have a smaller priority value, i.e. it should come first. During dfs(A), you check B before C. Since it is immediately taken from the queue again, B is processed first (but should not be). So, insert all adjacent nodes before querying the queue again.