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

그래프가 강하게 연결되어 있는지 확인 - C++에서 Set 1(DFS를 사용하는 Kosaraju)

<시간/>

그래프가 있다고 가정합니다. 그래프가 강하게 연결되어 있는지 여부를 Kosaraju 알고리즘을 사용하여 확인해야 합니다. 그래프는 강하게 연결되어 있다고 하며, 두 정점 사이에 경로가 있으면 그래프가 연결된 것입니다. 무방향 그래프는 강하게 연결된 그래프입니다.

일부 무방향 그래프는 연결될 수 있지만 강력하게 연결되지는 않습니다. 이것은 강하게 연결된 그래프의 예입니다.

그래프가 강하게 연결되어 있는지 확인 - C++에서 Set 1(DFS를 사용하는 Kosaraju)

이것은 연결되었지만 강하게 연결되지 않은 그래프의 예입니다.

그래프가 강하게 연결되어 있는지 확인 - C++에서 Set 1(DFS를 사용하는 Kosaraju)

여기서는 다음과 같은 Kosaraju 알고리즘 단계를 사용하여 그래프가 강하게 연결되어 있는지 확인하는 방법을 살펴보겠습니다.

단계 -

  • 모든 노드를 방문하지 않은 것으로 표시

  • 임의의 정점 u에서 DFS 순회를 시작합니다. DFS가 모든 노드를 방문하는 데 실패하면 false를 반환합니다.

  • 그래프의 모든 모서리 반전

  • 모든 정점을 방문하지 않은 노드로 다시 설정

  • 해당 정점 u에서 DFS 탐색을 시작합니다. DFS가 모든 노드를 방문하는 데 실패하면 false를 반환합니다. 그렇지 않으면 사실입니다.

예시

#include <iostream>
#include <list>
#include <stack>
using namespace std;
class Graph {
   int V;
   list<int> *adj;
   void dfs(int v, bool visited[]);
   public:
   Graph(int V) {
      this->V = V;
      adj = new list<int>[V];
   }
   ~Graph() {
      delete [] adj;
   }
   void addEdge(int v, int w);
   bool isStronglyConnected();
   Graph reverseArc();
};
void Graph::dfs(int v, bool visited[]) {
   visited[v] = true;
   list<int>::iterator i;
   for (i = adj[v].begin(); i != adj[v].end(); ++i)
   if (!visited[*i])
      dfs(*i, visited);
}
Graph Graph::reverseArc() {
   Graph graph(V);
   for (int v = 0; v < V; v++) {
      list<int>::iterator i;
      for(i = adj[v].begin(); i != adj[v].end(); ++i)
      graph.adj[*i].push_back(v);
   }
   return graph;
}
void Graph::addEdge(int u, int v) {
   adj[u].push_back(v);
}
bool Graph::isStronglyConnected() {
   bool visited[V];
   for (int i = 0; i < V; i++)
   visited[i] = false;
   dfs(0, visited);
   for (int i = 0; i < V; i++)
   if (visited[i] == false)
      return false;
   Graph graph = reverseArc();
   for(int i = 0; i < V; i++)
   visited[i] = false;
   graph.dfs(0, visited);
   for (int i = 0; i < V; i++)
   if (visited[i] == false)
      return false;
   return true;
}
int main() {
   Graph graph(5);
   graph.addEdge(0, 1);
   graph.addEdge(1, 2);
   graph.addEdge(2, 3);
   graph.addEdge(3, 0);
   graph.addEdge(2, 4);
   graph.addEdge(4, 2);
   graph.isStronglyConnected()? cout << "This is strongly connected" : cout << "This is not strongly connected";
}

출력

This is strongly connected