Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

방향 그래프가 트리인지 DFS를 사용하지 않는지 확인하는 C++ 프로그램

<시간/>

그래프에 사이클이 없으면 트리입니다. DFS를 사용하여 방향 그래프가 트리인지 아닌지 확인하는 C++ 프로그램입니다.

알고리즘

Beginfunction cyclicUtil() :a) 현재 노드를 방문한 것으로 표시하고 재귀 스택의 일부입니다. b) 이 꼭짓점에 인접한 모든 꼭짓점에 대해 재귀합니다. c) 재귀 stack.function cyclic()에서 꼭짓점 제거 

예시

#include#include #include 네임스페이스 표준 사용;class G { int n; 목록 *adj; //인접한 목록을 포함합니다. bool CyclicUtil(int v, bool 방문[], bool *rs); 공개:G(int V); // 생성자 void addEd(int v, int w); 부울 순환();};G::G(int n) { this->n =n; adj =new list [n];}void G::addEd(int v, int u) //그래프에 가장자리를 추가하려면 { adj[v].push_back(u); //v의 목록에 u 추가}bool G::CyclicUtil(int v, bool included[], bool *recurS) { if (visited[v] ==false) { Visited[v] =true; //현재 노드를 방문한 것으로 표시하고 재귀 스택의 일부 recurS[v] =true; // 이 정점에 인접한 모든 정점에 대해 반복합니다. 목록::반복자 i; for (i =adj[v].begin(); i !=adj[v].end(); ++i) { if (!visited[*i] &&CyclicUtil(*i, Visited, recurS)) return 진실; 그렇지 않으면 (recurS[*i])가 true를 반환합니다. } } 반복[v] =거짓; //재귀 스택에서 정점을 제거합니다. return false;}//그래프가 트리인지 notbool인지 확인 G::cyclic() { //모든 정점을 방문하지 않은 것으로 표시하고 재귀 스택의 일부가 아닌 것으로 표시 bool *visited =new bool[n]; bool *recurS =새로운 bool[n]; for (int i =0; i  

출력

방향 그래프는 트리가 아닙니다.