Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create isBipartiteGraph.hpp #465

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions include/CXXGraph/Graph/Algorithm/isBipartiteGraph.hpp
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The tests are failing. You need to include this file in CXXGraph/include/Graph/Graph.h

Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/***********************************************************/
/*** ______ ____ ______ _ ***/
/*** / ___\ \/ /\ \/ / ___|_ __ __ _ _ __ | |__ ***/
/*** | | \ / \ / | _| '__/ _` | '_ \| '_ \ ***/
/*** | |___ / \ / \ |_| | | | (_| | |_) | | | | ***/
/*** \____/_/\_\/_/\_\____|_| \__,_| .__/|_| |_| ***/
/*** |_| ***/
/***********************************************************/
/*** Header-Only C++ Library for Graph ***/
/*** Representation and Algorithms ***/
/***********************************************************/
/*** Author: ZigRazor ***/
/*** E-Mail: [email protected] ***/
/***********************************************************/
/*** Collaboration: ----------- ***/
/***********************************************************/
/*** License: AGPL v3.0 ***/
/***********************************************************/

#ifndef __CXXGRAPH_CHECK_ODD_NODES_CYCLE_H__
#define __CXXGRAPH_CHECK_ODD_NODES_CYCLE_H__

#pragma once

#include "CXXGraph/Graph/Graph_decl.h"

namespace CXXGraph {

template <typename T>
class Graph {
public:
TopoSortResult<T> checkOddNodesCycleDir() const;

private:
void checkOddNodesCycleUtil(std::vector<int>& visited, std::vector<int>& chainNo,
int root, int cycleLength, bool &isBiPartite) const;
};

template <typename T>
TopoSortResult<T> Graph<T>::checkOddNodesCycleDir() const {
TopoSortResult<T> result;

// Check if the graph is undirected
if (isDirectedGraph()) {
result.errorMessage = ERR_UNDIR_GRAPH; // Error: Graph is directed
return result;
}

const auto nodeSet = Graph<T>::getNodeSet();
std::vector<int> visited(nodeSet.size(), 0);
std::vector<int> chainNo(nodeSet.size(), -1);
bool isBiPartite = true;

for (const auto& node : nodeSet) {
if (!visited[node->getId()]) {
visited[node->getId()] = 1;
checkOddNodesCycleUtil(visited, chainNo, node->getId(), 0, isBiPartite);
if (!isBiPartite) {
result.errorMessage = "The graph contains an odd-length cycle.";
return result;
}
}
}

result.success = true;
return result;
}

template <typename T>
void Graph<T>::checkOddNodesCycleUtil(std::vector<int>& visited, std::vector<int>& chainNo,
int root, int cycleLength, bool &isBiPartite) const {
chainNo[root] = cycleLength;
for (const auto& child : cachedAdjMatrix->at(root)) {
sbaldu marked this conversation as resolved.
Show resolved Hide resolved
if (!visited[std::get<0>(child)->getId()]) {
visited[std::get<0>(child)->getId()] = 1;
checkOddNodesCycleUtil(visited, chainNo, std::get<0>(child)->getId(), cycleLength + 1, isBiPartite);
if (!isBiPartite) return;
} else if (chainNo[root] == chainNo[std::get<0>(child)->getId()]) {
isBiPartite = false;
return;
}
}
}

} // namespace CXXGraph

#endif // __CXXGRAPH_CHECK_ODD_NODES_CYCLE_H__
Loading