white collar 문제. 제가 작성한 소스코드에 대해서 질문드립니다.

  • bluefa
    bluefa

    우선 결론적으로는 이 문제는 다익스트라 알고리즘을 활용하여서
    해결하였는데, 처음에 작성한 소스코드가 왜 작동이 안하는지 몰라서 질문드립니다.

    bool path[1000][1000];
    bool visit[1000];
    int cache[1000],n;const int INF = 987654321;
    int counts[1000];

    int dp(int index)
    {
    if(index==n-1) return 0;

    int &ret = cache[index],i;
    if(ret!=-1) return ret;
    
    visit[index]= true;
    ret= INF;
    
    for(i=0;i<n;++i)
        if(path[index][i] && !visit[i])
            ret= min(ret, 1+ dp(i));
    
    visit[index]=false;
    
    return ret;

    }

    int backtrack(int current,int w)

    {

    if(index==n-1) return 1;
    
    int &ret= counts[index],next;
    if (ret!=-1) return ret;
    ret= 0;
    
    for(next=0;next<n;++next)
        if(path[current][next] && 1+cache[next]==w)
            ret =max(ret, backtrack(next,w-1));
    
    return ret;

    }
    (입력받는 부분은 생략)

    dfs와 dp 를 활용하여서 각 index 에서 n-1 까지 가는 최단경로를 기억해 놓는
    방식으로 알고리즘을 작성했습니다.

    그리고 구해진 최단경로는 cache라는 배열에 저장해 놓았고요. cache 는 -1로 초기화한 상태입니다.

    그리고 backtrack 이라는 함수를 활용하여서 현재 current 에서 n-1 번 정점까지의 최단경로의 길이 W가 있을때,

    current에서 next 까지의 경로가 존재하면서 next 에서 n-1 번 정점까지의 거리를 의미하는 cache[next] + 1 ( 1은 current 에서 next 까지의 거리)

    이 W와 같다면 재귀적으로 탐색을 시도하는 알고리즘인데요.

    여기서 만일 n-1 번까지 이어지게 된다면 1값을 받게 됩니다.

    혹시 제 알고리즘이나 소스코드에 문제점을 알려주실수 있나요?

    긴 글 읽어주셔서 감사합니다.


    9년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.