Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // C++ program for the above approach
- #include <bits/stdc++.h>
- using namespace std;
- #define maxN 100000
- // Adjacency List to store the graph
- vector<int> graph[maxN];
- // Array to store the in-degree of node
- int indegree[maxN];
- // Array to store the time in which
- // the job i can be done
- int job[maxN];
- // Function to add directed edge
- // between two vertices
- void addEdge(int u, int v)
- {
- // Insert edge from u to v
- graph[u].push_back(v);
- // Increasing the indegree
- // of vertex v
- indegree[v]++;
- }
- // Function to find the minimum time
- // needed by each node to get the task
- void topo(int vis[],int i,stack<int> &s){
- vis[i]=1;
- for(auto it:graph[i]){
- if(!vis[it])
- topo(vis,it,s);
- }
- s.push(i);
- }
- void printOrder(int n, int m)
- {
- int vis[n+1];
- stack<int>s;
- memset(vis,0,sizeof vis);
- for(int i=1; i<=n; i++){
- if(!vis[i])
- topo(vis,i,s);
- }
- int time[n+1];
- for(int i=0; i<=n; i++)
- time[i]=0;
- for(int i=1;i<=n;i++) {if(indegree[i]==0) time[i]=1;}
- while(!s.empty()){
- int node=s.top();
- s.pop();
- for(auto it:graph[node]){
- time[it]=max(time[it],time[node]+1);
- }
- }
- for(int i=1; i<=n; i++){
- cout<<time[i]<<" ";
- }
- }
- // Driver Code
- int main()
- {
- // Given Nodes N and edges M
- int n, m;
- n = 10;
- m = 13;
- // Given Directed Edges of graph
- addEdge(1, 3);
- addEdge(1, 4);
- addEdge(1, 5);
- addEdge(2, 3);
- addEdge(2, 8);
- addEdge(2, 9);
- addEdge(3, 6);
- addEdge(4, 6);
- addEdge(4, 8);
- addEdge(5, 8);
- addEdge(6, 7);
- addEdge(7, 8);
- addEdge(8, 10);
- // Function Call
- printOrder(n, m);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement