Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8. int n;
  9. cin >> n;
  10. cout.precision(20);
  11. vector<pair<double, double> > points;
  12. vector<vector<double >> g;
  13.  
  14. for (int i = 0; i < n; i++) {
  15. double x, y;
  16. cin >> x >> y;
  17. points.push_back(make_pair(x, y));
  18. }
  19.  
  20. for (int i = 0; i < n; i++) {
  21. vector<double> tmp;
  22. for (int j = 0; j < n; j++) {
  23. if (j == i) {
  24. tmp.push_back(0);
  25. } else {
  26. tmp.push_back(sqrt(pow((points[i].first - points[j].first), 2) +
  27. pow((points[j].second - points[i].second), 2)));
  28. }
  29. }
  30. g.push_back(tmp);
  31. tmp.clear();
  32. }
  33. /*
  34. for (int i = 0; i < n; i++) {
  35. for (int j = 0; j < n; j++) {
  36. cout << g[i][j] << " ";
  37. }
  38. cout << "\n";
  39. }
  40. */
  41. const int INF = 1000000000;
  42. vector<bool> used(n);
  43. vector<double> min_e(n, INF);
  44. vector<int> sel_e(n, -1);
  45. vector<pair<int, int>> res;
  46. double weight = 0;
  47. min_e[0] = 0;
  48. for (int i = 0; i < n; ++i) {
  49. int v = -1;
  50. for (int j = 0; j < n; ++j)
  51. if (!used[j] && (v == -1 || min_e[j] < min_e[v]))
  52. v = j;
  53.  
  54. used[v] = true;
  55. if (sel_e[v] != -1) {
  56. weight += g[v][sel_e[v]];
  57. res.push_back(make_pair(v + 1, sel_e[v] + 1));
  58.  
  59. }
  60. for (int to = 0; to < n; ++to)
  61. if (g[v][to] < min_e[to]) {
  62. min_e[to] = g[v][to];
  63. sel_e[to] = v;
  64. }
  65. }
  66. cout << weight << "\n";
  67. cout << n - 1 << "\n";
  68. for (auto el:res) {
  69. cout << el.first << " " << el.second << "\n";
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement