inflearn logo
강의

Course

Instructor

Coding Test Practice Test (with C++): For Large Companies

5. Hotel connection code explanation (Minimum spanning tree)

질문있습니다.

209

jw2914901790

2 asked

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
//Kruskal
#include <bits/stdc++.h>

using namespace std;
int unf[1001];
struct Hotel{
    int number;
    int x;
    int y;
    
    Hotel(int number, int x, int y){
        this->number = number;
        this->x = x;
        this->y = y;
    }
};

struct Road{
    int st;
    int et;
    double val;

    Road(int st, int et, double val){
        this->st = st;
        this->et =et;
        this->val =val;
    }

    bool operator<(const Road &ref)const{ //kruskal MST는 간선을 정렬함
        return val < ref.val;
    }
};

int Find(int v){
    if(v==unf[v]) return v;
    else return unf[v] = Find(unf[v]);
}

void Union(int a, int b){
    a = Find(a);
    b = Find(b);
    if(a!=b) unf[a] = b;
}

double DistanceCalculator(Hotel st, Hotel et){
    double res = ((et.x - st.x) * (et.x - st.x) + (et.y - st.y) * (et.y - st.y));
    return sqrt(res);
}

int main(int argc, const char * argv[]) {
    //ios_base::sync_with_stdio(false);
    
    int N,M;
    cin >> N >> M;
    vector<Hotel> node;
    vector<Road> edge;
    int x,y;
    
    for(int i = 1; i <= N; i++) unf[i] = i;
    
    for(int i = 0; i < N; i++){
        cin >> x >> y;
        node.push_back(Hotel(x,y));
    }
    for(int i=0; i<=N; i++){
        for(int j=i+1; j<=N; j++){
            if(i != j){
                edge.push_back(Road(node[i].number, node[j].number, DistanceCalculator(node[node[i].number-1],node[node[j].number-1])));
            }
        }
    }
    
    int st,et;
    for(int i = 0; i < M; i++){
        cin >> st >> et;
        Union(st, et); //연결함. 이미 연결했기 때문에 나중에 고려 안함.
    }
    sort(edge.begin(), edge.end());
    
    double res = 0;
    for (int i = 0; i < edge.size(); i++) {
        int fa = Find(edge[i].st);//해당 노드의 집합 번호
        int fb = Find(edge[i].et);
        if(fa != fb){ // 같지 않으면 Cycle이 돌지 않으므로
            res += edge[i].val; // 최소비용에 누적
            Union(edge[i].st,edge[i].et); //집합 연결시켜주기
        }
    }
    
    printf("%0.2f",res);
    
    return 0;
}

코테 준비 같이 해요! C++

Answer 1

0

jw2914901790

선생님께서는 호텔 위치 좌표를 X,Y 벡터에 저장하셨는데

저는 구조체에 저장해놓고 거리를 계산했습니다.

그래도 사실상 동작은 똑같을텐데 왜 오답이 되는지 잘 모르겠습니다.

이 상태 그대로 선생님처럼 X,Y벡터로 변경하면 정답이 뜹니다..

0

jw2914901790

아 Hotel 구조체에서 x,y 자료형을 double로 변경하니까 해결됐습니다

xcode에서 컴파일할때는 잘 되는데 왜그런걸까요?

int자료형으로 계산한 값이 double로 형변환될 때 문제가 발생하는건가요?

조합을 구할때 algorithm 함수 next_permutation 사용 가능 여부

0

457

1

최악의 경우 연산 질문이 있습니다.

0

411

1

로컬 환경과 다르게 오답이라고 나와서 문의 드립니다.

0

302

1

6강 3번 정사각형 그리키 코드 질문 드립니다.

0

242

1

1-5 효율적인 공부 dy를 시간(N)으로 하는 풀이 질문

0

320

1

반복수와 시간초 계산을 어떻게 하나요??

0

333

1

왜 DP로 풀어야하는지 궁금합니다

0

242

1

선생님 안녕하세요. 다른 풀이에 대한 질문이 있습니다.

0

223

1

문제 해결방법에 대한 질문이 있습니다.

0

245

0

바둑대회 코딩 질문

0

270

1

6분 11초에서 dis [0][][]3차원 격자판이있는데요. 격자판안에 숫자는 문제에 없던데 어떻게 구해지는건가요?

0

200

0

실전모의고사 5회 1번 패턴찾기 질문있습니다.

0

220

1

전역변수관련 질문입니다.

0

255

1

5-1 패턴찾기 문제 질문드립니다.

0

218

1

오렌지 나무 문제 질문드립니다

0

310

1

코드 한번 봐주시면 감사하겠습니다!

0

175

1

코드 한번 봐주시면 감사하겠습니다!

0

234

1

코드 한번 봐주시면 감사하겠습니다!

0

198

1

시작점의 ch

0

204

1

vector에서 질문이 있습니다~!

0

235

1

그대로 따라했는데 시간 초과가 나왔습니다

0

161

1

2회 모의고사 4번 숲속의 기사 코드 질문이 있습니다.

0

288

1

이렇게 풀면 반례가 어떻게되나요?

0

245

1

1회 1번 공통 문자열 문제 설명 보충하시면 더 좋을 것 같습니다!

0

221

1