class Solution {
public:
void topo_w(int node,vector<vector<int>>&adj,vector<int>&visited,vector<int>&order)
{
visited[node]=1;
for(int x:adj[node]){
if(!visited[x])topo_w(x,adj,visited,order);
}
order.push_back(node);
}
void DFS(int node,vector<int>&visited,vector<vector<int>>&adj){
visited[node]=1;
for(int x:adj[node])if(!visited[x])DFS(x,visited,adj);
}
int kosaraju(int V, vector<vector<int>> &edges) {
// code here
vector<vector<int>>adj(V);
vector<vector<int>>rev_adj(V);
for(auto e:edges){
adj[e[0]].push_back(e[1]);
rev_adj[e[1]].push_back(e[0]);
}
vector<int>visited1(V,0);
vector<int>visited2(V,0);
vector<int>order;
for(int i=0;i<V;i++){
if(!visited1[i])topo_w(i,adj,visited1,order);
}
reverse(order.begin(),order.end());
int ans=0;
for(int x:order){
if(!visited2[x])
{
DFS(x,visited2,rev_adj);
ans++;
}
}
return ans;
}
};
No comments:
Post a Comment