2012-04-28 3 views
0

여기에 버그가 C에서 DFS ++를 사용하여 위상 정렬은위상 정렬을 사용하여 DFS

#include<iostream> 
#include<stdio.h> 
using namespace std; 
int count=0; 
static int *a=new int[8]; 

void dfs(int u,bool v[],bool matrix[][8]) 
{ 
    v[u]=true; 
    for(int i=0;i<8;i++) 
     if(!v[i]&& matrix[u][i]) 
      dfs(i,v,matrix); 

    a[count++]=u; 
} 

int main() 
{ 
    bool v[8]; 
    bool matrix[8][8]; 
    matrix[7][6]=true; 
    matrix[0][1]; 
    matrix[1][2]=true; 
    matrix[2][3]=true; 
    matrix[3][4]=true; 
    matrix[2][5]=true; 
    for(int i=0;i<8;i++) 
     if(!v[i]) 
      dfs(i,v,matrix); 
    for(int i=0;i<8;i++) 
    cout<<a[7-i]<<" "; 
} 

, 내가 행렬을 작성해야한다고 생각이 오류를 해결하기 위해 좀 도와주세요 (바인딩 오류 중)이다 [8] [ 2], 어떻게 그 후에 계속할 것인가?

+0

범위를 벗어난 액세스'a [count ++] = u;'에 대한 후보가 하나 있습니다. 재귀 호출 중에'count'가 * 항상 * 범위 내에 있음을 어떻게 알 수 있습니까? –

+0

어떤 오류가 발생합니까? 'v'와'matrix'에있는 많은 요소들이 초기화되지 않았다는 사실과 관련이 있습니까? – Attila

+0

@BoPersson -'dfs '를 호출하는 조건은'v [i]'가'false'라는 것입니다. 'v'에는 단지 8 개의 원소가 있고'dfs'에서는 현재'false'로 설정되어 있습니다. 그래서 재귀 때문에 인덱스가 과잉 될 것이라고 생각하지 않습니다. – Attila

답변

2

나는 몇 가지 변경을 완료하고 이제 프로그램이 ideone 가장 큰 변화를 성공적으로 완료 당신도이없이 매트릭스와 V를 (초기화 여전히 성공적으로 완료 프로그램을 변경하지 않았다하지만 출력은 0-S이었다). 나는 당신이 말하는 오류를 보지 못했습니다. v를 초기화하지 않은 경우에만 0을 얻는 이유는 분명합니다. 모든 값은 0이 아니므로 모든 노드가 방문하지 않는 것으로 간주됩니다.

EDIT : 잊어 버린 것 같은 27 번째 줄도 변경했습니다. "= true;

편집 2 : 좋지 않은 메모리를 해제하지 않았습니다. 또한 왜 동적 배열이 필요한지 모르겠다. 당신은 그 크기를 미리 알고 있습니다. 그리고 마지막으로 말하자면, 배열 행렬과 v 전역을 자동으로 제로로 만들면 (이것은 올바른 접근법이라고 지적하는 것이 아닙니다), 지역적이므로 0이되지 않습니다.