Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.04 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<vector<double>> graph;
  6. vector<pair<int, int>> mapp;
  7.  
  8. double way(pair<int, int> a, pair<int, int> b) {
  9.     int x1 = a.first;
  10.     int y1 = a.second;
  11.     int x2 = b.first;
  12.     int y2 = b.second;
  13.     double w = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
  14.     return w;
  15. }
  16.  
  17. double Prim() {
  18.     vector<double> min_e(graph.size());
  19.     vector<int> visited(graph.size());
  20.     vector<int> parent(graph.size());
  21.     int n = graph.size();
  22.     for (int i = 0; i != n; ++i) {min_e[i] = 100000000;}
  23.     for (int i = 0; i != n; ++i) {parent[i] = -1;}
  24.     for (int i = 0; i != n; ++i) {visited[i] = 0;}
  25.     min_e[0] = 0;
  26.     double sum = 0;
  27.     for (size_t i = 0; i != graph.size(); ++i) {
  28.         int v = -1;
  29.         for (size_t j = 0; j != graph.size(); ++j) {
  30.             if (visited[j] == 0 && (v == -1 || min_e[j] < min_e[v])) {
  31.                 v = j;
  32.             }
  33.         }
  34.         visited[v] = 1;
  35.         if (parent[v] != -1) {
  36.             int p = parent[v];
  37.             sum = sum + graph[v][p];
  38.         }
  39.         for (size_t k = 0; k != graph.size(); ++k) {
  40.             if (graph[v][k] < min_e[k]) {
  41.                 min_e[k] = graph[v][k];
  42.                 parent[k] = v;
  43.             }
  44.         }
  45.     }
  46.     return sum;
  47. }
  48.  
  49. void add_gr(pair<int, int> a) {
  50.     for (size_t i = 0; i != graph.size(); ++i) {
  51.         graph[i].push_back(way(a, mapp[i]));
  52.     }
  53.     vector<double> meow;
  54.     for (size_t j = 0; j != graph[0].size(); ++j) {
  55.         meow.push_back(way(mapp[j], a));
  56.     }
  57.     graph.push_back(meow);
  58.     mapp.push_back(a);
  59. }
  60.  
  61. void delete_gr(pair<int, int> a) {
  62.     for (size_t i = 0; i != graph.size(); ++i) {
  63.         graph[i].pop_back();
  64.     }
  65.     graph.pop_back();
  66.     mapp.pop_back();
  67. }
  68.  
  69. int main() {
  70.     int n;
  71.     cin >> n;
  72.     int K;
  73.     cin >> K; //  роутеры
  74.     ::graph.resize(n);
  75.     for (size_t i = 0; i != n; ++i) {
  76.         for (size_t j = 0; j != n; ++j) {
  77.             graph[i].push_back(0);
  78.         }
  79.     }
  80.  
  81.     vector<pair<int, int>> conn;
  82.     int max_x=0, min_x=0, max_y=0, min_y=0;
  83.     for (size_t i = 0; i != n; ++i) {
  84.         int x, y;
  85.         cin >> x >> y;
  86.         pair<int, int> a(x, y);
  87.         if (x < min_x) {min_x=x;}
  88.         if (x > max_x) {max_x=x;}
  89.         if (y < min_y) {min_y=y;}
  90.         if (y > max_y) {max_y=y;}
  91.         mapp.push_back(a);
  92.     }
  93.     for (size_t i = 0; i != n; ++i) {
  94.         for (size_t j = 0; j != n; ++j) {
  95.             graph[i][j] = way(mapp[i], mapp[j]);
  96.         }
  97.     }
  98.     double min_connection = Prim();
  99.     int step_x = 1;
  100.     int step_y = 1;
  101.     int side_x = max_x - min_x;
  102.     int side_y = max_y - min_y;
  103.  
  104.     if (side_x >= 500 && side_x < 1000) {
  105.         step_x = 15;
  106.     } else if (side_x >= 1000 && side_x < 5000) {
  107.         step_x = 20;
  108.     } else if (side_x >= 5000 && side_x < 7500) {
  109.         step_x = 50;
  110.     } else if (side_x >= 7500) {
  111.         step_x = 70;}
  112.  
  113.     if (side_y >= 500 && side_y < 1000) {
  114.         step_x = 15;
  115.     } else if (side_y >= 1000 && side_y < 5000) {
  116.         step_x = 20;
  117.     } else if (side_y >= 5000 && side_y < 7500) {
  118.         step_x = 50;
  119.     } else if (side_y >= 7500) {
  120.         step_x = 70;}
  121.  
  122.     for (size_t k = 0; k != K; ++k) {
  123.         int new_x=-1, new_y=-1;
  124.         for (size_t x = 0; x != max_x; x = step_x + x) {
  125.             for (size_t y = 0; y != max_y; y = step_y + y) {
  126.                 pair<int, int> p(x, y);
  127.                 add_gr(p);
  128.                 double new_connection = Prim();
  129.  
  130.                 if (min_connection > new_connection) {
  131.                     min_connection = new_connection;
  132.                     new_x = x;
  133.                     new_y = y;
  134.                 }
  135.                 delete_gr(p);
  136.             }
  137.         }
  138.         if (new_x != -1) {
  139.             pair<int, int> p = make_pair(new_x, new_y);
  140.             conn.push_back(p);
  141.             add_gr(p);
  142.         }
  143.     }
  144.     cout << conn.size() << '\n';
  145.     for (size_t i = 0; i != conn.size(); ++i) {
  146.         cout << conn[i].first << ' ' << conn[i].second << '\n';
  147.     }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement