Skip to content

Commit 26ca078

Browse files
Merge pull request codemistic#465 from sameer-19/main
Added Kosaraju and Floyd Warshall Algorithm in CPP
2 parents 1db6543 + dfef25e commit 26ca078

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

CPP/graph_tree/Floyd Warshall.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Function of floyd Warshall algorithm
2+
3+
void floydWarshall(vector<vector<int>> &distance) // distance is the adjacency matrix of nodes 0 to n-1
4+
{
5+
int n=distance.size(),i,j,k;
6+
7+
for(k=0;k<n;k++)
8+
{
9+
for(i=0;i<n;i++)
10+
{
11+
for(j=0;j<n;j++)
12+
{
13+
if(distance[i][k]==INT_MAX || distance[k][j]==INT_MAX) continue;
14+
else if(distance[i][k]+distance[k][j]<distance[i][j])
15+
{
16+
distance[i][j] = distance[i][k]+distance[k][j];
17+
}
18+
}
19+
}
20+
}
21+
22+
for(i=0;i<n;i++)
23+
{
24+
if(distance[i][i]<0)
25+
{
26+
cout<<"Negative cycle present";
27+
return;
28+
}
29+
}
30+
31+
for(i=0;i<n;i++)
32+
{
33+
for(j=0;j<n;j++)
34+
{
35+
cout<<distance[i][j]<<" ";
36+
}
37+
cout<<endl;
38+
}
39+
40+
return;
41+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Kosaraju Algorithm - By Sameer Aggrawal
2+
3+
// Similar to topological sort function (dfs)
4+
void dfs(int node,vector<int> adj[],vector<bool> &visited,stack<int> &stk)
5+
{
6+
visited[node] = true;
7+
8+
for(auto child: adj[node])
9+
{
10+
if(!visited[child])
11+
{
12+
dfs(child,adj,visited,stk);
13+
}
14+
}
15+
16+
stk.push(node);
17+
}
18+
19+
void dfsRec(int node,vector<int> g[],vector<bool> &visited)
20+
{
21+
visited[node]=true;
22+
23+
for(auto child: g[node])
24+
{
25+
if(!visited[child])
26+
{
27+
dfsRec(child,g,visited);
28+
}
29+
}
30+
31+
return;
32+
}
33+
34+
//Function to find number of strongly connected components in the graph.
35+
int kosaraju(int V, vector<int> adj[])
36+
{
37+
int i,j;
38+
39+
stack<int> stk;
40+
41+
vector<int> result;
42+
vector<bool> visited(V,false);
43+
44+
for(i=0;i<V;i++)
45+
{
46+
if(!visited[i])
47+
{
48+
dfs(i,adj,visited,stk);
49+
}
50+
}
51+
52+
while(!stk.empty())
53+
{
54+
result.push_back(stk.top());
55+
stk.pop();
56+
}
57+
58+
vector<int> g[V];
59+
60+
for(i=0;i<V;i++)
61+
{
62+
for(auto x: adj[i])
63+
{
64+
g[x].push_back(i);
65+
}
66+
}
67+
68+
for(i=0;i<V;i++) visited[i]=false;
69+
70+
int cnt=0;
71+
72+
for(i=0;i<V;i++)
73+
{
74+
int node=result[i];
75+
if(!visited[node])
76+
{
77+
cnt++;
78+
dfsRec(node,g,visited);
79+
}
80+
}
81+
82+
return cnt;
83+
}

0 commit comments

Comments
 (0)