Breadth-First Search (BFS)
void BFS(int s) {
bool *visited = new bool[V];
for(int i = 0; i < V; i++)
visited[i] = false;
list queue;
visited[s] = true;
queue.push_back(s);
list::iterator i;
while(!queue.empty()) {
s = queue.front();
cout << s << " ";
queue.pop_front();
for(i = adj[s].begin(); i != adj[s].end(); ++i) {
if(!visited[*i]) {
visited[*i] = true;
queue.push_back(*i);
}
}
}
}
Depth-First Search (DFS)
void DFSUtil(int v, bool visited[]) {
visited[v] = true;
cout << v << " ";
list::iterator i;
for(i = adj[v].begin(); i != adj[v].end(); ++i)
if(!visited[*i])
DFSUtil(*i, visited);
}
void DFS(int v) {
bool *visited = new bool[V];
for(int i = 0; i < V; i++)
visited[i] = false;
DFSUtil(v, visited);
}
Dijkstra's Algorithm
int minDistance(int dist[], bool sptSet[]) {
int min = INT_MAX, min_index;
for(int v = 0; v < V; v++)
if(sptSet[v] == false && dist[v] <= min)
min = dist[v], min_index = v;
return min_index;
}
void dijkstra(int graph[V][V], int src) {
int dist[V];
bool sptSet[V];
for(int i = 0; i < V; i++)
dist[i] = INT_MAX, sptSet[i] = false;
dist[src] = 0;
for(int count = 0; count < V - 1; count++) {
int u = minDistance(dist, sptSet);
sptSet[u] = true;
for(int v = 0; v < V; v++)
if(!sptSet[v] && graph[u][v] &&
dist[u] != INT_MAX &&
dist[u] + graph[u][v] < dist[v])
dist[v] = dist[u] + graph[u][v];
}
}
Bellman-Ford Algorithm
void BellmanFord(struct Graph* graph, int src) {
int V = graph->V;
int E = graph->E;
int dist[V];
for(int i = 0; i < V; i++)
dist[i] = INT_MAX;
dist[src] = 0;
for(int i = 1; i <= V - 1; i++) {
for(int j = 0; j < E; j++) {
int u = graph->edge[j].src;
int v = graph->edge[j].dest;
int weight = graph->edge[j].weight;
if(dist[u] != INT_MAX &&
dist[u] + weight < dist[v])
dist[v] = dist[u] + weight;
}
}
for(int i = 0; i < E; i++) {
int u = graph->edge[i].src;
int v = graph->edge[i].dest;
int weight = graph->edge[i].weight;
if(dist[u] != INT_MAX &&
dist[u] + weight < dist[v])
printf("Graph contains negative weight cycle");
}
}
Floyd-Warshall Algorithm
void floydWarshall(int graph[][V]) {
int dist[V][V], i, j, k;
for(i = 0; i < V; i++)
for(j = 0; j < V; j++)
dist[i][j] = graph[i][j];
for(k = 0; k < V; k++) {
for(i = 0; i < V; i++) {
for(j = 0; j < V; j++) {
if(dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
Kruskal's Algorithm
int find(int parent[], int i) {
if(parent[i] == i)
return i;
return find(parent, parent[i]);
}
void Union(int parent[], int rank[], int x, int y) {
int xroot = find(parent, x);
int yroot = find(parent, y);
if(rank[xroot] < rank[yroot])
parent[xroot] = yroot;
else if(rank[xroot] > rank[yroot])
parent[yroot] = xroot;
else {
parent[yroot] = xroot;
rank[xroot]++;
}
}
void KruskalMST() {
Edge result[V];
int e = 0, i = 0;
qsort(edge, E, sizeof(edge[0]), myComp);
int parent[V], rank[V];
for(int v = 0; v < V; v++) {
parent[v] = v;
rank[v] = 0;
}
while(e < V - 1 && i < E) {
Edge next_edge = edge[i++];
int x = find(parent, next_edge.src);
int y = find(parent, next_edge.dest);
if(x != y) {
result[e++] = next_edge;
Union(parent, rank, x, y);
}
}
}
Prim's Algorithm
int minKey(int key[], bool mstSet[]) {
int min = INT_MAX, min_index;
for(int v = 0; v < V; v++)
if(mstSet[v] == false && key[v] < min)
min = key[v], min_index = v;
return min_index;
}
void printMST(int parent[], int graph[V][V]) {
printf("Edge \tWeight\n");
for(int i = 1; i < V; i++)
printf("%d - %d \t%d \n", parent[i], i, graph[i][parent[i]]);
}
void primMST(int graph[V][V]) {
int parent[V];
int key[V];
bool mstSet[V];
for(int i = 0; i < V; i++)
key[i] = INT_MAX, mstSet[i] = false;
key[0] = 0;
parent[0] = -1;
for(int count = 0; count < V - 1; count++) {
int u = minKey(key, mstSet);
mstSet[u] = true;
for(int v = 0; v < V; v++)
if(graph[u][v] && mstSet[v] == false &&
graph[u][v] < key[v])
parent[v] = u, key[v] = graph[u][v];
}
printMST(parent, graph);
}
Topological Sort
void topologicalSortUtil(int v, bool visited[],
stack &Stack) {
visited[v] = true;
list::iterator i;
for(i = adj[v].begin(); i != adj[v].end(); ++i)
if(!visited[*i])
topologicalSortUtil(*i, visited, Stack);
Stack.push(v);
}
void topologicalSort() {
stack Stack;
bool *visited = new bool[V];
for(int i = 0; i < V; i++)
visited[i] = false;
for(int i = 0; i < V; i++)
if(visited[i] == false)
topologicalSortUtil(i, visited, Stack);
while(Stack.empty() == false) {
cout << Stack.top() << " ";
Stack.pop();
}
}
Union-Find (Disjoint Set)
int find(int parent[], int i) {
if(parent[i] == -1)
return i;
return find(parent, parent[i]);
}
void Union(int parent[], int x, int y) {
int xset = find(parent, x);
int yset = find(parent, y);
parent[xset] = yset;
}
bool isCycle(int graph[][2], int V, int E) {
int *parent = new int[V];
for(int i = 0; i < V; i++)
parent[i] = -1;
for(int i = 0; i < E; i++) {
int x = find(parent, graph[i][0]);
int y = find(parent, graph[i][1]);
if(x == y)
return true;
Union(parent, x, y);
}
return false;
}