bool isCyclic(graph &g) // Returns true if the graph g contains a cycle. Otherwise, returns false. { queue<int> que; int id=0,count=1; bool first=true; vector<int> parentCount(g.numNodes(),-1); que.push(id); g.visit(id); while(count<g.numNodes() || !que.empty()) { if (que.empty()) { id=count; que.push(id); g.visit(id); count++; } else id=que.front(); for(int i=0;i<g.numNodes();i++) { if (g.isEdge(id,i) && i!=que.front()) { if(!g.isVisited(i)) { g.visit(i); que.push(i); count++; parentCount[i]=id; } else if(parentCount[id]==i) continue; else { for (int z=0;z<g.numNodes();z++) g.unVisit(z); return true; } } } que.pop(); } for (int z=0;z<g.numNodes();z++) g.unVisit(z); return false; }
bool isConnected(graph &g) // Returns true if the graph g is connected. Otherwise returns false. { queue<int> que; int id=0,count=1; que.push(id); g.visit(id); while(count<g.numNodes() && !que.empty()) { id=que.front(); for(int i=0;i<g.numNodes();i++) { if (g.isEdge(id,i) && !g.isVisited(i)) { g.visit(i); que.push(i); count++; } } que.pop(); } for (int z=0;z<g.numNodes();z++) g.unVisit(z); if(count==g.numNodes()) return true; else return false; }
void findSpanningForest(graph &g, graph &sf) // Create a graph sf that contains a spanning forest on the graph g. { queue<int> que; int id=0,count=1; bool first=true; vector<int> parentCount(g.numNodes(),-1); que.push(id); g.visit(id); while(count<g.numNodes() || !que.empty()) { if (que.empty()) { id=count; que.push(id); g.visit(id); count++; } else id=que.front(); for(int i=0;i<g.numNodes();i++) { if (g.isEdge(id,i) && i!=que.front()) { if(!g.isVisited(i) && parentCount[id]!=i) { g.visit(i); sf.addEdge(id,i,g.getEdgeWeight(i,id)); sf.addEdge(i,id,g.getEdgeWeight(i,id)); que.push(i); count++; parentCount[id]++; } } } que.pop(); } for (int z=0;z<g.numNodes();z++) g.unVisit(z); }