Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5.  
  6. const int INF = 1000000000; // значение "бесконечность"
  7. const int terminals = 7; // количество терминальных вершин
  8. const int all = 2 * terminals; / количество всех вершин
  9. const int MOD = 20;
  10.  
  11. using namespace std;
  12. /*
  13. struct mystruct{ //трехмерные точки с евклидовой нормой
  14.     int x, y, z;
  15.     mystruct(int x = 0, int y = 0, int z = 0) {}
  16.     void gen() {
  17.         x = rand() % MOD;
  18.         y = rand() % MOD;
  19.         z = rand() % MOD;
  20.     }
  21. };
  22.  
  23. double dist(mystruct a, mystruct b){
  24.     return sqrt(pow(a.x - b. x, 2.) + pow(a.y - b. y, 2.) + pow(a.z - b.z, 2.));
  25. }*/
  26.  
  27.  
  28. struct mystruct{
  29.     int x, y;
  30.     mystruct(int x = 0, int y = 0) {}
  31.     void gen() {
  32.         x = rand() % MOD;
  33.         y = rand() % MOD;
  34.     }
  35. };
  36.  
  37. double dist(mystruct a, mystruct b){
  38.     // return sqrt(pow(a.x - b.x, 2.) + pow(a.y - b.y, 2.) ); евклидова норма для двумерных точек
  39.     return max(abs(a.x - b.x), abs(a.y - b.y)); // норма по модулю максимума
  40. }
  41.  
  42.  
  43.  
  44. double weithTree(vector < vector <double> > &g) { //мин. остовное дерево
  45.     const int n = g.size();
  46. // алгоритм
  47.  
  48.     double ans = 0;
  49.     vector<bool> used (n);
  50.     vector<int> min_e (n, INF), sel_e (n, -1);
  51.     min_e[0] = 0;
  52.     for (int i=0; i<n; ++i) {
  53.         int v = -1;
  54.         for (int j=0; j<n; ++j)
  55.             if (!used[j] && (v == -1 || min_e[j] < min_e[v]))
  56.                 v = j;
  57.         if (min_e[v] == INF) {
  58.             cout << "No MST!";
  59.             return 0;
  60.         }
  61.  
  62.         used[v] = true;
  63.         if (sel_e[v] != -1)
  64.            // cout << v << " " << sel_e[v] << " " << g[v][sel_e[v]] << endl;
  65.             ans += g[v][sel_e[v]];
  66.  
  67.         for (int to=0; to<n; ++to)
  68.             if (g[v][to] < min_e[to]) {
  69.                 min_e[to] = g[v][to];
  70.                 sel_e[to] = v;
  71.             }
  72.     }
  73.  
  74.     return ans;
  75. }
  76.  
  77. vector <mystruct> gen () { // генерация вершин
  78.     vector <mystruct> ans(all);
  79.     for (int i = 0; i < all; ++i) {
  80.         ans[i].gen();//make_pair(rand() % MOD, rand() % MOD);
  81.     }
  82.     return ans;
  83. }
  84.  
  85. vector< vector<double> > makeG(vector <mystruct> &map) { //делаем матрицу смежности из вершин на входе
  86.     const int n = map.size();
  87.     vector<vector<double> > g(n, vector<double> (n));
  88.     for (int i = 0; i < n; ++i) {
  89.         for (int j = 0; j < n; ++j) {
  90.             g[i][j] = dist(map[i], map[j]);
  91.         }
  92.     }
  93.     return g;
  94. }
  95.  
  96. double getOnly(vector<int> only, vector <mystruct> &map) { //ищем мин. ост. дерево на выбранных вершинах
  97.     vector <mystruct> postMap;
  98.     for (auto it = only.begin(); it != only.end(); ++it)
  99.         postMap.push_back(map[*it]);
  100.     vector < vector <double> > g = makeG(postMap);
  101.     return weithTree(g);
  102. }
  103.  
  104. vector<int> intToArray(int num){         // так как все терминальные вершины находятся в начале, то
  105.     vector<int> a;                      //  мы всегда их берем в подмножество вершин
  106.     for (int i = 0; i < terminals; ++i)
  107.         a.push_back(i);
  108.     int j = terminals;
  109.     while (num > 0) {
  110.         if (num % 2 == 1)
  111.             a.push_back(j);
  112.         num /= 2;
  113.         ++j;
  114.     }
  115.     return a;
  116. }
  117.  
  118.  
  119. double solve(){ //переберем все подмножества и выберем лучшее
  120.     int subterm = all -terminals;
  121.     vector <mystruct> map = gen();
  122.     double notOpt;
  123.     double ans = getOnly(intToArray(0), map);
  124.     notOpt = ans;
  125.  
  126.     for (int i = 1; i < pow(2., subterm); ++i)
  127.         ans = min(ans, getOnly(intToArray(i), map));
  128.     return (ans - notOpt) / notOpt;
  129. }
  130.  
  131. int main() {
  132.     srand(1);
  133.     for (int i = 0; i < 100; ++i)
  134.         printf("%.2f, ", solve());
  135.     return 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement