Topological Sort pseudocode:
TOPOLOGICAL-SORT(V, E)
Here is a simple implementatin of Topological Sort:
TOPOLOGICAL-SORT(V, E)
- Call DFS(V, E) to compute finishing times f[v] for each vertex v
- When each vertex is finished, insert it onto the front of a linked list
- Return the linked list of vertices
Here is a simple implementatin of Topological Sort:
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define sz 100
vector<int> graph[sz]; //storing the graph
vector<int> topo; //storing the topo ordering
int disc[sz],fin[sz],color[sz];
int time=0;
void dfs_visit(int node)
{
int i,j,k,temp;
color[node]=1;
disc[node]= ++time; //discovery time
for(i=0;i<graph[node].size();i++)
{
temp=graph[node][i];
if(color[temp]==0)
{
dfs_visit(temp);
}
}
color[node]=2;
fin[node]= ++time; //finishing time
topo.push_back(node);
}
void dfs(int node)
{
int i;
for(i=0;i<node;i++)
{
if(color[i]==0)
{
dfs_visit(i);
}
}
}
int main()
{
int i,j,k,num,t,node,edge,a,b;
scanf("%d%d",&node,&edge); //number of node and edges
for(i=0;i<edge;i++)
{
scanf("%d%d",&a,&b);
graph[a].push_back(b); //directed graph
}
//initialization
for(i=0;i<node;i++) color[i]=0;
dfs(node); //calling dfs to calculate discovery and finishing time
/*
for(i=0;i<node;i++)
printf("%d-> %d %d\n",i,disc[i],fin[i]);
*/
//here i use stl vector, so i need to reverse the list
//using stl list wouldn't need this line
reverse(topo.begin(),topo.end());
printf("Topological Sort:\n");
for(i=0;i<topo.size();i++)
printf("%d ",topo[i]);
return 0;
}
No comments:
Post a Comment