RECLAMATION 문제 질문드립니다.

  • sven
    sven

    RECLAMATION

    각 섬을 정점으로 생각하고, 정점 사이의 거리를 섬의 모든 꼭지점을 비교하면서 dist 함수를 통해 구했습니다. 그러면 minimal spanning tree 문제로 귀결되는어 그리디하게 해결했습니다. 어느 부분에 문제가 있는지 조언 부탁드립니다.

    #include <iostream>
    #include <vector>
    #include <queue>
    #include <cassert>
    #include <climits>
    
    #define X 55
    
    using namespace std;
    
    void solve();
    int counter;
    int dist(pair <int, int> a, pair <int, int> b);
    
    class E
    {
    public:
        int start, end, val;
        E(int x, int y, int z)
        {
            start = x;
            end = y;
            val = z;
        }
    
        friend bool operator < (const E& A, const E& B)
        {
            return A.val < B.val;
        }
    };
    
    int main()
    {
        int T;
        cin >> T;
        while(T--)
            solve();
    }
    
    void solve()
    {
        int N;
        cin >> N;
        vector <vector <pair <int, int> > > coord;
        for(int i=1; i<=N; i++)
        {
            int P;
            cin >> P;
            vector <pair <int, int> > temp;
            for(int j=0; j<P; j++)
            {
                int temp0, temp1;
                cin >> temp0 >> temp1;
                temp.push_back(make_pair(temp0, temp1));
            }
            coord.push_back(temp);
        }
    
        int A[N][N];
        for(int i=0; i<N; i++)
            A[i][i] = 0;
        int counter = 0;
        priority_queue <E> B;
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                A[i][j] = INT_MAX;
    
        for(int i=0; i<N; i++)
            for(int j=i+1; j<N; j++)
            {
                int tempAns = INT_MAX;
                for(int I=0; I<coord[i].size(); I++)
                    for(int J=0; J<coord[j].size(); J++)
                        tempAns = min(tempAns, dist(coord[i][I], coord[j][J]));
                A[i][j] = tempAns;
            }
    
        for(int i=0; i<N; i++)
            for(int j=i+1; j<N; j++)
                A[j][i] = A[i][j];
    
        /*
        for(int i=0; i<N; i++)
        {
            for(int j=0; j<N; j++)
                cout << A[i][j] << "\t";
            cout << endl;
        }
        */
    
        int head = 0;
        int ans;
        bool flag[N];
        for(int i=0; i<N; i++)
            flag[i] = true;
        flag[0] = false;
    
        while(++counter && counter < N)
        {
            for(int i=0; i<N; i++)
                if(flag[i])
                    B.push(E(head, i, A[head][i]));
    
            while(!flag[B.top().end] && !B.empty())
                B.pop();
            if(B.empty()) assert(0);
            ans = B.top().val;
            head = B.top().end;
            flag[head] = false;
            B.pop();
        }
        cout << (ans)/2 << endl;
    }
    
    
    int dist(pair <int, int> a, pair <int, int> b)
    {
        return max(abs(a.first - b.first), abs(a.second - b.second));
    }
    

    11년 전
3개의 댓글이 있습니다.
  • 꿀호떡
    꿀호떡

    두 섬 사이의 거리가 항상 꼭지점 사이의 거리에서만 나올까요?..
    가령 ㅣ 자 모양의 매우 긴 변이 있고 매우 가까운 거리에 ㄷ자 모양의 섬이 있다고 하면...


    11년 전 link
  • VOCList
    VOCList

    1
    2
    4 0 0 100 0 100 1 0 1
    4 50 3 51 3 51 4 50 4

    위 경우를 한번 생각해보세요.


    11년 전 link
  • sven
    sven

    아, 문제를 완전히 잘못 이해했네요. 감사합니다.


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