RECLAMATION 문제 질문드립니다. 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 1 2 4 0 0 100 0 100 1 0 1 4 50 3 51 3 51 4 50 4 위 경우를 한번 생각해보세요. 11년 전 link sven 아, 문제를 완전히 잘못 이해했네요. 감사합니다. 11년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
sven
RECLAMATION
각 섬을 정점으로 생각하고, 정점 사이의 거리를 섬의 모든 꼭지점을 비교하면서 dist 함수를 통해 구했습니다. 그러면 minimal spanning tree 문제로 귀결되는어 그리디하게 해결했습니다. 어느 부분에 문제가 있는지 조언 부탁드립니다.
11년 전