TSP1 오류 입니다.

  • skylife927
    skylife927

    예제는 다 맞췄는데 출제하고 나면 오류로 나오는데요.
    1. 순열을 구한다.
    2. 해당 나열의 값을 더한다.
    3. 혹 MIN값 이상된다면 return한다.(가지치기)

    왜그런지 이상하네요@_@;

    #include <iostream>
    
    using namespace std;
    
    double abc[10][10];
    double MIN=999999;
    
    void swap(int* arr, int i, int j){
        int temp  = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    void perm(int* arr, int depth, int n){
        if(depth == n){
            /*for(int i=0; i<n; i++){
                cout<<arr[i]<<" ";
            }cout<<endl;*/
            //한턴에 다음것을 가지고 좌표를 찾아 값을 넣는다.
            double sum=0;
            for(int i=0; i<n-1; i++){
                double temp = abc[arr[i]][arr[i+1]];
                sum+=temp;
                if(sum > MIN) return;
            }
            if(MIN > sum) MIN = sum;
            return;
        }
        for(int i=depth; i<n; i++){
            swap(arr, i, depth);
            perm(arr, depth+1, n);
            swap(arr, i ,depth);
        }
    }
    
    
    int main(int argc, char** argv)
    {
        int test_case;
        int T;
    
        int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7};
        cin >> T;
        for(test_case = 0; test_case < T; test_case++)
        {
            int n;
            cin>>n;
    
            for(int i=0; i<n; i++){
                for(int j=0; j<n; j++){
                    cin>>abc[i][j];
                }
            }
    
            perm(arr, 0, n);
            printf("%.10lf\n", MIN);
        }
        return 0;
    }
    

    8년 전
2개의 댓글이 있습니다.
  • skylife927
    skylife927

    어떤 예외케이스가 있는지.. 흠..


    8년 전 link
  • skylife927
    skylife927
    1. N이 1인경우를 고려안했네요.
    2. MIN값에 대한 초기화가 안되어 있었습니다.

    해결완료!


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