재귀 적 역 추적을 사용하여 유 방향 그래프에서 모든주기 찾기

뇌 폭풍

재귀 역 추적을 사용하여 방향 그래프에서주기를 찾는 중입니다. 이것에 대한 제안 의사가 여기 , 여기있는이 :

dfs(adj,node,visited):  
  if (visited[node]):  
    if (node == start):  
      "found a path"  
    return;  
  visited[node]=YES;  
  for child in adj[node]:  
    dfs(adj,child,visited)
  visited[node]=NO;

시작 노드로 위 함수를 호출합니다.

visited = {}
dfs(adj,start,visited)

이 알고리즘은와 비교할 때 가장 효율적인 알고리즘은 아니지만 Tarjans algorithm이해하기에는 충분히 간단합니다. 현재이 코드에는 감지 된 횟수주기 수가 없습니다.

나는 이것을 자바로 구현했다.

//this is the main method that calls the helper DFS which runs on each node
public int allCyclesDirectedmain(){
    //this initializes all vertices
    clearAll();
    int[] count = new int[1];
    for (Vertex v: vertexMap.values()){
        //System.out.println(v.name);
        //clearAll();
        dfs(v,v,count);
    }
    return count[0];
}

//start and v are same when the method first fires.
public void dfs(Vertex start, Vertex v,int[] count){
   if (v.isVisited){
       if (start==v){
           //found a path
           count[0]++;
       }
       return ;
   }
   v.setVisited(true);
   for (Edge e : v.adj){
       Vertex next = e.target;
       dfs(start,next,count);
   }
   v.setVisited(false);
}

다음 모서리가있는 그래프의 경우 :
(1 2),(2 3),(3 1),(2 5),(5 6),(6 2)-출력으로 6주기를 얻습니다.

(1 2),(2 3),(3 4),(4,1),(2 5),(5 6),(6 2) -출력으로 7주기를 얻습니다.

내 현재 코드가 이미 이전에 감지 된주기의 일부인 각 정점에 대해주기 감지를 수행하는 것을 볼 수 있습니다 (예 : 3 개의 노드가있는주기는 각 개별 노드에 대해 3 개의주기를 제공하지만 이것이 하나 여야 함). 여기에 무엇이 잘못되고 몇 가지 수정 사항에 대한 몇 가지 팁이 필요합니다.

베른하르트 바커

의 경우 (1 2),(2 3),(3 1)다음을 호출합니다.

  • dfs(vertex1, vertex1, count), 당신에게주기를 제공합니다 1 -> 2 -> 3 -> 1.
  • dfs(vertex2, vertex2, count), 당신에게주기를 제공합니다 2 -> 3 -> 1 -> 2.
  • dfs(vertex3, vertex3, count), 당신에게주기를 제공합니다 3 -> 1 -> 2 -> 3.

그래서 당신은 같은주기를 여러 번 세고 있습니다.

내가 생각할 수있는 가장 간단한 수정은 단순히 dfs호출 후 방문 플래그를 설정하는 것입니다 .

public int allCyclesDirectedmain(){
    clearAll();
    int[] count = new int[1];
    for (Vertex v: vertexMap.values()){
        dfs(v,v,count);
        v.setVisited(true); // <---
    }
    return count[0];
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

디렉토리에 영향을주지 않고 찾기를 사용하여 모든 파일을 재귀 적으로 실행 불가능하게 만드는 방법은 무엇입니까?

분류에서Dev

Prolog에서 증분기를 사용하여 각 재귀 호출을 추적

분류에서Dev

목록과 제한이 주어지면 재귀 / 역 추적 알고리즘을 사용하여 최대 합계 찾기

분류에서Dev

유 방향 그래프에서 대략적인 가장 긴주기

분류에서Dev

사전 데이터 구조를 사용하여 유 방향 그래프에서 노드가 3 개 이상있는 모든주기를 찾습니다.

분류에서Dev

및 배열에서 모든 자식 범주를 재귀 적으로 찾기-PHP

분류에서Dev

Jackson을 사용하여 재귀 적 Map <String, Object>를 역 직렬화 한 후 유형 안전 경고 방지

분류에서Dev

찾기를 사용하여 재귀 적으로 폴더 이동

분류에서Dev

재귀 적 CTE- 관리자 아래 모든 직원 찾기

분류에서Dev

작성기 DAG를 사용하여 GCP 버킷에서 재귀 적으로 파일 이름을 읽는 방법

분류에서Dev

명령 줄에서 주어진 regexp를 사용하여 원격 http / https 디렉토리 (비재 귀적으로)의 크기를 찾는 방법

분류에서Dev

scikit-learn을 사용하여 Random Forest에서 재귀 적 기능 제거

분류에서Dev

여러 요청에 대한 방향성 비순환 그래프에서 효율적인 루트 찾기

분류에서Dev

보기에 데코레이터 적용-역방향으로 URL을 찾을 수 없음

분류에서Dev

C에서 역 추적 알고리즘을 사용하여 스도쿠 풀기

분류에서Dev

스칼라에서 기능적으로 프로그래밍 할 때 재귀에서 배열을 사용하는 것이 효율적입니까?

분류에서Dev

유 방향 그래프의 모든 정점을 정확히 한 번 방문하는 경로 찾기

분류에서Dev

유 방향 그래프에서 두 특정 정점 사이의 모든 노드 찾기

분류에서Dev

find를 사용하여 디렉토리에 포함 된 모든 파일에서 프로그램을 재귀 적으로 실행하는 방법

분류에서Dev

R에서 재귀를 사용하여 모든 조합 찾기

분류에서Dev

첫 번째 솔루션을 찾은 후 역 추적 재귀를 종료하는 방법

분류에서Dev

주기를 유도하는 모든 모서리를 찾기위한 효율적인 알고리즘

분류에서Dev

미로를 생성하기위한 재귀 역 추적기 구현

분류에서Dev

ElementTree와 해당 레벨에서 모든 유사한 태그를 재귀 적으로 찾는 방법은 무엇입니까?

분류에서Dev

SQL Server에서 겹치는 기간을 재귀 적으로 찾는 방법

분류에서Dev

Windows 명령 모든 파일을 기본 폴더에 재귀 적으로 복사

분류에서Dev

여러 파일 유형을 포함하기 위해 or 연산자를 사용하여 디렉토리의 모든 코드 행을 재귀 적으로 계산하는 방법

분류에서Dev

자바에서 기본 재귀 코드를 추적하는 방법

분류에서Dev

사전과 차원에서 가능한 모든 조합을 생성하는 기능적이고 꼬리 재귀적인 방법

Related 관련 기사

  1. 1

    디렉토리에 영향을주지 않고 찾기를 사용하여 모든 파일을 재귀 적으로 실행 불가능하게 만드는 방법은 무엇입니까?

  2. 2

    Prolog에서 증분기를 사용하여 각 재귀 호출을 추적

  3. 3

    목록과 제한이 주어지면 재귀 / 역 추적 알고리즘을 사용하여 최대 합계 찾기

  4. 4

    유 방향 그래프에서 대략적인 가장 긴주기

  5. 5

    사전 데이터 구조를 사용하여 유 방향 그래프에서 노드가 3 개 이상있는 모든주기를 찾습니다.

  6. 6

    및 배열에서 모든 자식 범주를 재귀 적으로 찾기-PHP

  7. 7

    Jackson을 사용하여 재귀 적 Map <String, Object>를 역 직렬화 한 후 유형 안전 경고 방지

  8. 8

    찾기를 사용하여 재귀 적으로 폴더 이동

  9. 9

    재귀 적 CTE- 관리자 아래 모든 직원 찾기

  10. 10

    작성기 DAG를 사용하여 GCP 버킷에서 재귀 적으로 파일 이름을 읽는 방법

  11. 11

    명령 줄에서 주어진 regexp를 사용하여 원격 http / https 디렉토리 (비재 귀적으로)의 크기를 찾는 방법

  12. 12

    scikit-learn을 사용하여 Random Forest에서 재귀 적 기능 제거

  13. 13

    여러 요청에 대한 방향성 비순환 그래프에서 효율적인 루트 찾기

  14. 14

    보기에 데코레이터 적용-역방향으로 URL을 찾을 수 없음

  15. 15

    C에서 역 추적 알고리즘을 사용하여 스도쿠 풀기

  16. 16

    스칼라에서 기능적으로 프로그래밍 할 때 재귀에서 배열을 사용하는 것이 효율적입니까?

  17. 17

    유 방향 그래프의 모든 정점을 정확히 한 번 방문하는 경로 찾기

  18. 18

    유 방향 그래프에서 두 특정 정점 사이의 모든 노드 찾기

  19. 19

    find를 사용하여 디렉토리에 포함 된 모든 파일에서 프로그램을 재귀 적으로 실행하는 방법

  20. 20

    R에서 재귀를 사용하여 모든 조합 찾기

  21. 21

    첫 번째 솔루션을 찾은 후 역 추적 재귀를 종료하는 방법

  22. 22

    주기를 유도하는 모든 모서리를 찾기위한 효율적인 알고리즘

  23. 23

    미로를 생성하기위한 재귀 역 추적기 구현

  24. 24

    ElementTree와 해당 레벨에서 모든 유사한 태그를 재귀 적으로 찾는 방법은 무엇입니까?

  25. 25

    SQL Server에서 겹치는 기간을 재귀 적으로 찾는 방법

  26. 26

    Windows 명령 모든 파일을 기본 폴더에 재귀 적으로 복사

  27. 27

    여러 파일 유형을 포함하기 위해 or 연산자를 사용하여 디렉토리의 모든 코드 행을 재귀 적으로 계산하는 방법

  28. 28

    자바에서 기본 재귀 코드를 추적하는 방법

  29. 29

    사전과 차원에서 가능한 모든 조합을 생성하는 기능적이고 꼬리 재귀적인 방법

뜨겁다태그

보관