UVA_10034_Freckles

来源:互联网 发布:开个淘宝工作室怎么样 编辑:程序博客网 时间:2024/05/17 08:16
#include<iostream>  #include<sstream>  #include<string>  #include<vector>  #include<list>  #include<set>  #include<map>  #include<stack>  #include<queue>  #include<algorithm>  #include<cmath>  #pragma warning(disable:4996)  using std::cin;using std::cout;using std::endl;using std::stringstream;using std::string;using std::vector;using std::list;using std::pair;using std::set;using std::multiset;using std::map;using std::multimap;using std::stack;using std::queue;using std::sort;class DisjoinSet{private:vector<int>represent, rank;public:DisjoinSet(const int &n) :represent(n), rank(n){for (int i = 0; i < n; i++){represent[i] = i;}}int find(int i){return represent[i] = represent[i] == i ? i : find(represent[i]);}void merge(const int &x, const int &y){auto a = find(x); auto b = find(y);if (rank[a] < rank[b]){represent[a] = b;}else{represent[b] = a;if (rank[b] == rank[a]){rank[a]++;}}}};class Edge{public:pair<int,int>vertex;double weight;Edge(const pair<int, int>&v, const double &w){vertex = v;weight = w;}};bool compare(const Edge&a, const Edge&b){if (a.weight != b.weight){return a.weight < b.weight;}if (a.vertex.first != b.vertex.first){return a.vertex.first < b.vertex.first;}return a.vertex.second < b.vertex.second;}vector<Edge>getEdge(){int n; cin >> n;vector<pair<double, double>>vertex(n);map<pair<double, double>, int>Map;for (int i = 0; i < n; i++){cin >> vertex[i].first >> vertex[i].second;Map.insert({ { vertex[i].first, vertex[i].second },0 });}int i = 0;for (auto iter = Map.begin(); iter != Map.end(); iter++){iter->second = i++;}vector<Edge>edge;for (size_t i = 0; i < n; i++){for (size_t j = i + 1; j < n; j++){edge.push_back({ {Map[vertex[i]],Map[vertex[j]] }, sqrt(pow(vertex[i].first - vertex[j].first,2) + pow(vertex[i].second - vertex[j].second, 2)) });}}sort(edge.begin(), edge.end(), compare);return edge;}double kruscal(const vector<Edge>&edge){DisjoinSet union_set((int)sqrt(edge.size()*2)+1);double sum = 0;int block = (int)sqrt(edge.size() * 2) + 1;for (size_t i = 0; i < edge.size(); i++){if (union_set.find(edge[i].vertex.first) != union_set.find(edge[i].vertex.second)){union_set.merge(edge[i].vertex.first, edge[i].vertex.second);sum += edge[i].weight;block--;if (block == 1){return sum;}}}return 0;}int main(){//freopen("input.txt","r",stdin);  //freopen("output.txt","w",stdout);int T; cin >> T;while (T--){auto edge=getEdge();printf("%.2lf\n", kruscal(edge));if (T){cout << endl;}}return 0;}

0 0
原创粉丝点击