Program:
/* Q1.WAP to implement topological sort. */ #include<iostream> using namespace std; class Graph { int **g; int n,dir,weighted; int start; public: Graph() { cout<<"\n\n Enter number of vertices:"; cin>>n; cout<<"\n Enter 0-Un-Directed 1-Directed:"; cin>>dir; cout<<"\n Enter 0-Non-Weighted 1-Weighted:"; cin>>weighted; cout<<"\n Enter Start Vertex:"; cin>>start; g = new int*[n]; for(int i=0;i<n;i++) { g[i] = new int[n]; for(int j=0;j<n;j++) { g[i][j] = 0; } } } void readGraphByEdges(); void showGraphByAdj(); void topology(); }; void Graph::readGraphByEdges() { cout<<"\n\n Enter "<<n<<" Vertices:"; int u,v,w; while(1) { if(weighted == 1) { cout<<"\n Enter u,v,w -1 to stop:"; cin>>u>>v>>w; if(v == -1 || u == -1 ) { break; } if(dir == 0) { g[u][v] = w; g[v][u] = w; } else { g[u][v] = w; } } else { cout<<"\n Enter u,v -1 to stop:"; cin>>u>>v; if(v == -1 || u == -1 ) { break; } if(dir == 0) { g[u][v] = 1; g[v][u] = 1; } else { g[u][v] = 1; } } } } void Graph::showGraphByAdj() { cout<<"\n\n Displaying Graph:"; for(int i=0;i<n;i++) { cout<<endl; for(int j=0;j<n;j++) { cout<<g[i][j]<<" "; } } cout<<endl; } void Graph::topology() { int *visited = new int[n]; int *indegree = new int[n]; int i,j,c; // 1. initialize for(i=0;i<n;i++) { visited[i] = 0; indegree[i] = 0; } // 2. find indegree for(i=0;i<n;i++) { c = 0; for(j=0;j<n;j++) { if(g[j][i] != 0) { c++; } } indegree[i] = c; } cout<<"\n Topological Sort: "; int v, ne; ne = n; // 3. find indegree 0 while(ne > 0) { int flag = 0; for(i=0;i<n;i++) { if(indegree[i] == 0 && visited[i] == 0) { cout<<i<<" "; flag = 1; break; } } if(flag == 0) { cout<<"\n Topological Sort not possible!"; break; } // Update v = i; visited[v] = 1; for(i = 0;i<n;i++) { if(g[v][i] != 0) { indegree[i]--; } } ne--; } } int main() { Graph g; g.readGraphByEdges(); g.showGraphByAdj(); g.topology(); return 0; }
Input File:
6 1 0 0 0 1 0 2 1 3 2 3 1 4 3 5 5 4 -1 -1
Output: