제출 #1337589

#제출 시각아이디문제언어결과실행 시간메모리
1337589luisgsSirni (COCI17_sirni)C++20
42 / 140
1509 ms851968 KiB
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std;

struct Edge {
    int u, v, weight;
    
    bool operator<(const Edge& other) const {
        return weight < other.weight;
    }
};

class DisjointSet {
public:
    vector<int> parent;
    vector<int> size;

    DisjointSet(int N) {
        parent.resize(N);
        size.resize(N);
        for (int i = 0; i < N; ++i) {
            parent[i] = i;
            size[i] = 1; 
        }
    }

    int find_set(int v) {
        if (v == parent[v])
            return v;
        return parent[v] = find_set(parent[v]); 
    }

    void union_set(int a, int b) {
        a = find_set(a);
        b = find_set(b);
        if (a != b) {
            if (size[a] < size[b])
                swap(a, b);
            parent[b] = a;
            size[a] += size[b];
        }
    }

    bool connected(int v1, int v2) {
        return find_set(v1) == find_set(v2);
    }
};

int main() {
	int card_num;
	vector<vector<int>> adj_matrix;
	vector<Edge> edges;
    vector<Edge> mst_edges;
	long long total_cost = 0;

	cin >> card_num;

	vector<int> cards(card_num);

	for (int &c : cards) {
		cin >> c;
		//cout << c << endl;
		if (c < 1){
			//cout << c << endl;
			return 0;
		}
	}

	sort(cards.begin(), cards.end());
	cards.erase(unique(cards.begin(), cards.end()), cards.end());

	card_num = cards.size();
	
	adj_matrix.assign(card_num, vector<int>(card_num, 0));
	DisjointSet linked_cards(cards.size());

 	for (int i = 0; i < card_num; ++i) {
        for (int j = i + 1; j < card_num; ++j) {
            int weight = cards[j] % cards[i];
            
            adj_matrix[i][j] = weight;
            adj_matrix[j][i] = weight;
        }
    } 

    for (int i = 0; i < card_num; ++i) {
        for (int j = i + 1; j < card_num; ++j) {
            edges.push_back({i, j, adj_matrix[i][j]});
        }
    }

	sort(edges.begin(), edges.end());

	for (const Edge& edge : edges) {
        if (!linked_cards.connected(edge.u, edge.v)) {
            
            linked_cards.union_set(edge.u, edge.v);
            
            total_cost += edge.weight;
            mst_edges.push_back(edge);
            
            if (mst_edges.size() == card_num - 1) {
                break;
            }
        }
    }

    cout << total_cost << endl;

	//cout << "MST Total: " << total_cost << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...