문제

https://www.acmicpc.net/problem/1774

걸린 시간

00 : 43 : 22

풀이

C++

#include <bits/stdc++.h>
#define INF 1e9
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

struct DisjointSet{
    vector<int> parent, rank;
    DisjointSet(int n): parent(n), rank(n, 1){
        for(int i = 0; i < n; i++)
            parent[i] = i;
    }
    int find(int u) {
        if(u == parent[u]) return u;
        return parent[u] = find(parent[u]);
    }
    void merge(int u, int v){
        u = find(u); v = find(v);
        if(u == v) return;
        if(rank[u] > rank[v]) swap(u, v);
        parent[u] = v;
        if(rank[u] == rank[v]) rank[v]++;
    }
};

struct node{
    int u, v;
    double cost;
    node(int u, int v, double cost){
        this->u = u;
        this->v = v;
        this->cost = cost;
    }
};

bool compare(node a, node b){
    return a.cost < b.cost;
}

int n, m;
double adj[1000][1000];
double x[1000], y[1000];

double kruskal(){
    double ret = 0;
    vector<node> edges;
    for(int u = 0; u < n; u++)
        for(int v = 0; v < n; v++)
            if(adj[u][v] != 0)
                edges.push_back(node(u, v, adj[u][v]));
    sort(edges.begin(), edges.end(), compare);
    DisjointSet sets(n);
    int u, v;
    for(int i = 0; i < m; i++){
        cin >> u >> v;
        sets.merge(u-1, v-1);
    }
    for(int i = 0; i < edges.size(); i++){
        double cost = edges[i].cost;
        int u = edges[i].u;
        int v = edges[i].v;
        if(sets.find(u) == sets.find(v)) continue;
        sets.merge(u, v);
        ret += cost;
    }
    return ret;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    for(int i = 0; i < n; i++)
        cin >> x[i] >> y[i];
    for(int u = 0; u < n; u++)
        for(int v = 0; v < n; v++){
            double dist = sqrt(pow(x[u]-x[v], 2) + pow(y[u]-y[v], 2));
            adj[u][v] = dist;
            adj[v][u] = dist;
        }
    printf("%.2lf\n", kruskal());
    return 0;
}

이미 연결된 통로를 disjoint set 에 추가해주고 크루스칼 알고리즘을 수행하면 쉽게 ac 를 받을 줄 알았지만, cout 의 setprecision 함수를 사용하는 바람에 틀렸습니다가 출력되었다.

아마도 printf 와 다르게 소수점 이하 자릿수가 0일 땐 출력하지 않기 때문이 아닐까 싶다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 11657번 타임머신  (0) 2020.11.10
Baekjoon 16946번 벽 부수고 이동하기 4  (0) 2020.11.09
Baekjoon 2186번 문자판  (0) 2020.11.08
Baekjoon 1976번 여행 가자  (0) 2020.11.06
Baekjoon 9177번 단어 섞기  (0) 2020.11.05

댓글