Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <tuple>
  7. #include <list>
  8. #include <cstdio>
  9. #include <cstdlib>
  10. #include <string>
  11. #include <cstring>
  12. #include <climits>
  13. #include <cfloat>
  14. #include <set>
  15. #include <map>
  16. #include <queue>
  17. #include <stdexcept>
  18. #include <iomanip>
  19. #include <unordered_map>
  20.  
  21. using namespace std;
  22.  
  23. // Shortcuts for common data types
  24. typedef long long LL;
  25. typedef unsigned long long ULL;
  26. typedef long double LD;
  27. typedef pair<int, int> pii;
  28. typedef vector<pii> vii;
  29. typedef vector<int> vi;
  30.  
  31. //Structs
  32. struct graphInfo{
  33.     unordered_map<int, int> parentMap;
  34.     unordered_map<int, int> rankMap;
  35. };
  36.  
  37. // Various
  38. void printGraph(vector<vector<pair<int, float>>> graph);
  39.  
  40. double &dFS(vector<vector<pair<int, float>>> graph, int source, int target);
  41.  
  42. void printPath(vector<int> Parent, int target);
  43.  
  44. void printDist(vector<double> dists);
  45.  
  46. vector<tuple<int, int, float>> kruskal(vector<vector<pair<int, float>>> garph);
  47.  
  48. int parentFind(int u, unordered_map<int, int> parentMap);
  49.  
  50. graphInfo unionNodes(int u, int v, graphInfo gi);
  51.  
  52. #define rep(i, n) for(int i=0;i<(n);i++)
  53. #define foreach(i, a) for(__typeof(a.begin()) i = a.begin(); i != a.end(); i++)
  54. #define feq(x, y) (fabs(x-y) <= DBL_EPSILON)
  55. #define min(a, b) ((a)<(b)?(a):(b))
  56. #define max(a, b) ((a)>(b)?(a):(b))
  57.  
  58. // Bit operations
  59. #define set_bit(x, i) (x) |= (1 << (i))
  60. #define clr_bit(x, i) (x) & ~(1 << (i))
  61. #define tog_bit(x, i) (x) ^= (1 << (i))
  62. #define chk_bit(x, i) (((x) >> (i)) & 1)
  63.  
  64. // Quick scanning
  65. #define sf(n)       scanf("%d", &n)
  66. #define sff(a, b)    scanf("%d %d", &a, &b)
  67. #define sfff(a, b, c) scanf("%d %d %d", &a, &b, &c)
  68.  
  69. // Useful constants
  70. #define MOD 1000000007
  71. #define INF ((int) 1e9)
  72. #define EPS 1e-9
  73.  
  74. // Shortcuts for pair
  75. #define x first
  76. #define y second
  77.  
  78. // Debugging
  79. #define DBUG(x)    std::cout<<#x<<" is "<<x<<"\n"
  80.  
  81.  
  82. int main() {
  83.     std::ios::sync_with_stdio(false); // Speedup (do not mix with scanf/prinf)
  84.     std::cin.tie(NULL); // Speedup (do not mix with scanf/prinf)
  85.     std::cout << std::fixed;
  86.     std::cout << std::setprecision(2); //print as 1.1234
  87.  
  88.     int t, n, s;
  89.     cin >> t;
  90.     for (int test = 0; test < t; test++) {
  91.         cin >> s >> n;
  92.         int x[500] = {};
  93.         int y[500] = {};
  94.         for (int i = 0; i < n; i++) {
  95.             cin >> x[i];
  96.             cin >> y[i];
  97.         }
  98.  
  99.         vector<vector<pair<int, float>>> graph(n);
  100.         for (int i = 0; i < n; i++) {
  101.             for (int j = i + 1; j < n; j++) {
  102.                 float dist = sqrt(pow(x[i] - x[j], 2.0) + pow(y[i] - y[j], 2.0));
  103.                 graph[i].push_back(make_pair(j, dist));
  104.                 graph[j].push_back(make_pair(i, dist));
  105.             }
  106.         }
  107.         vector<tuple<int, int, float>> mst = kruskal(graph);
  108.         float ans = get<2>(mst[n - s - 1]);
  109.         cout << ans << endl;
  110.     }
  111.     return 0;
  112. }
  113.  
  114. vector<tuple<int, int, float>> kruskal(vector<vector<pair<int, float>>> graph) {
  115.     vector<tuple<int, int, float>> allEdges;
  116.     vector<pair<int, float >> neighbours;
  117.     vector<tuple<int, int, float>> mst;
  118.     for (int i = 0; i < graph.size(); i++) {
  119.         neighbours = graph[i];
  120.         for (int j = 0; j < neighbours.size(); j++) {
  121.             allEdges.push_back(make_tuple(i, neighbours[j].first, neighbours[j].second));
  122.         }
  123.     }
  124.     sort(begin(allEdges), end(allEdges),
  125.          [](tuple<int, int, float> const &t1, tuple<int, int, float> const &t2) {
  126.              return get<2>(t1) < get<2>(t2);
  127.          }
  128.     );
  129.     /* for (int i=0; i<allEdges.size(); i++){
  130.          cout << get<0> (allEdges[i])<< "\t" << get<1>(allEdges[i]) << "\t" << get<2>(allEdges[i]) << endl;
  131.      }*/
  132.     graphInfo gi;
  133.     for (int i = 0; i < allEdges.size(); i++) {
  134.         gi.parentMap[i] = i;
  135.         gi.rankMap[i] = 0;
  136.     }
  137.  
  138.     for (int i = 0, j=0;j<graph.size()-1 ; i += 2) {
  139.         clock_t begin,beginOneUnion,stopOneUnion;
  140.         begin = clock();
  141.         int u = get<0>(allEdges[i]);
  142.         int v = get<1>(allEdges[i]);
  143.         if (parentFind(u, gi.parentMap) != parentFind(v, gi.parentMap)) {
  144.             mst.push_back(allEdges[i]);
  145.             beginOneUnion=clock();
  146.             gi = unionNodes(u, v,gi);
  147.             stopOneUnion=clock();
  148.             j++;
  149.             //cout << i <<"\t" << j<<endl;
  150.         }
  151.         clock_t end = clock();
  152.         double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
  153.         double elapsed_secsOneUnion = double(stopOneUnion - beginOneUnion) / CLOCKS_PER_SEC;
  154.         //cout<<i<<"\t"<< elapsed_secs<<"/t"<<elapsed_secsOneUnion<<endl;
  155.     }
  156.     vector<tuple<int, int, float>>::const_iterator first = allEdges.begin();
  157.     vector<tuple<int, int, float>>::const_iterator last = allEdges.begin() + graph.size();
  158.     //vector<tuple<int, int, float>> mst(first, last);
  159.     /*
  160.     for (int i = 0; i < mst.size(); i++) {
  161.         cout << get<0> (mst[i])<< "\t" << get<1>(mst[i]) << "\t" << get<2>(mst[i]) << endl;
  162.     }*/
  163.     return mst;
  164. }
  165.  
  166. graphInfo unionNodes(int u, int v, graphInfo gi) {
  167.     //unordered_map<int, int> parentMap=gi.parentMap;
  168.     //unordered_map<int, int> rankMap=gi.rankMap;
  169.  
  170.     //clock_t begin1 = clock();
  171.     int pu = parentFind(u, gi.parentMap);
  172.     int pv = parentFind(v, gi.parentMap);
  173.     //clock_t begin2 = clock();
  174.     if (gi.rankMap[pu]<gi.rankMap[pv]) gi.parentMap[pu] = pv;
  175.     else if(gi.rankMap[pv]<gi.rankMap[pu]) gi.parentMap[pv] =pu;
  176.     else{
  177.         if(rand()%2==0){
  178.             gi.parentMap[pu]=pv;
  179.             gi.rankMap[pv]++;
  180.         } else{
  181.             gi.parentMap[pv]=pu;
  182.             gi.rankMap[pu]++;
  183.         }
  184.     }
  185.     //clock_t end = clock();
  186.     //double elapsed_secs1 = double(end - begin1) / CLOCKS_PER_SEC;
  187.     //double elapsed_secs2 = double(end - begin2) / CLOCKS_PER_SEC;
  188.     //cout<<elapsed_secs1<<"\t"<<elapsed_secs2<<endl;
  189.     return gi;
  190. }
  191.  
  192. //Tested, time =0.00
  193. int parentFind(int u, unordered_map<int, int> parentMap) {
  194.     while (u != parentMap[u]) u = parentMap[u];
  195.     return u;
  196. }
  197.  
  198. void printPath(vector<int> parent, int node) {
  199.     if (parent[node] >= 0) {
  200.         cout << "The parent of " << node << " is " << parent[node] << endl;
  201.         printPath(parent, parent[node]);
  202.     }
  203.     return;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement