Advertisement
karlicoss

кастрированные алгоритмы

Jul 1st, 2012
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cstdio>
  5. #include <cstdlib>
  6. using namespace std;
  7.  
  8. struct sort_net
  9. {
  10.     int n;
  11.     vector<vector<pair<int, int> > > sn;
  12.     sort_net()
  13.     {
  14.  
  15.     }
  16.     sort_net(int n, vector<vector<pair<int, int> > > sn)
  17.     {
  18.         this->n = n;
  19.         this->sn = sn;
  20.     }
  21.     bool check(vector<int> &v)
  22.     {
  23.         for (int i = 0; i < sn.size(); i++)
  24.         {
  25.             for (int j = 0; j < sn[i].size(); j++)
  26.             {
  27.                 if (v[sn[i][j].first] > v[sn[i][j].second])
  28.                     swap(v[sn[i][j].first], v[sn[i][j].second]);
  29.             }
  30.         }
  31.         for (int i = 1; i < v.size(); i++)
  32.             if (v[i] < v[i - 1])
  33.                 return false;
  34.         return true;
  35.     }
  36.     bool is_sorting()
  37.     {
  38.         vector<int> t(n);
  39.         for (int i = 0; i < (1 << n); i++)
  40.         {
  41.             for (int j = 0; j < n; j++)
  42.                 t[j] = (i >> j) & 1;
  43.  
  44.             if (!check(t))
  45.                 return false;
  46.         }
  47.         return true;
  48.     }
  49.     void print()
  50.     {
  51.         int comps = 0;
  52.         int layers = 0;
  53.         for (int i = 0; i < sn.size(); i++)
  54.         {
  55.             comps += sn[i].size();
  56.             if (sn[i].size() > 0)
  57.                 layers++;
  58.         }
  59.         cout << n << " " << comps << " " << layers << endl;
  60.         for (int i = 0; i < sn.size(); i++)
  61.         {
  62.             if (sn[i].size() == 0)
  63.                 continue;
  64.             printf("%d ", sn[i].size());
  65.             for (int j = 0; j < sn[i].size(); j++)
  66.                 printf("%d %d ", sn[i][j].first + 1, sn[i][j].second + 1);
  67.             printf("\n");
  68.         }
  69.     }
  70. };
  71.  
  72. vector<vector<pair<int, int> > > sn;
  73.  
  74. int build_merger(vector<int> v, int d)
  75. {
  76.     if (v.size() <= 1)
  77.         return d;
  78.     if (v.size() == 2)
  79.     {
  80.         sn[d].push_back(make_pair(v[0], v[1]));
  81.         return d + 1;
  82.     }
  83.     vector<int> odd;
  84.     vector<int> even;
  85.     int sz = v.size();
  86.     for (int i = 0; i < sz / 2; i++)
  87.     {
  88.         if (i % 2 == 0)
  89.             even.push_back(v[i]);
  90.         else
  91.             odd.push_back(v[i]);
  92.     }
  93.     for (int i = sz / 2; i < sz; i++)
  94.     {
  95.         if (i % 2 == 0)
  96.             even.push_back(v[i]);
  97.         else
  98.             odd.push_back(v[i]);
  99.     }
  100.  
  101.     int d1 = build_merger(odd, d);
  102.     int d2 = build_merger(even, d);
  103.     int md = max(d1, d2);
  104.     for (int i = 1; i < v.size(); i += 2)
  105.     {
  106.         if (i + 1 < v.size())
  107.         {
  108.             sn[md].push_back(make_pair(v[i], v[i + 1]));
  109.         }
  110.     }
  111.     return md + 1;
  112. }
  113.  
  114. int build_sorter(int l, int r, int d)//âåðíåò ãëóáèíó
  115. {
  116.     if (l + 1 > r)
  117.         return d;
  118.     if (l + 1 == r)
  119.     {
  120.         sn[d].push_back(make_pair(l, r));
  121.         return d + 1;
  122.     }
  123.     int sz = r - l + 1;
  124.     int d1 = build_sorter(l, l + sz / 2 - 1, d);
  125.     int d2 = build_sorter(l + sz / 2, r, d);
  126.     int md = max(d1, d2);
  127.     vector<int> v;
  128.     for (int i = l; i <= r; i++)
  129.         v.push_back(i);
  130.    
  131.     int rd = build_merger(v, md);
  132.     return rd;
  133. }
  134.  
  135. void build_net(int n)
  136. {
  137.     sn.clear();
  138.     sn.resize(20);
  139.  
  140.     int p2 = 1;
  141.     while (p2 < n)
  142.         p2 *= 2;
  143.     build_sorter(0, p2 - 1, 0);
  144.    
  145.     while (sn.size() > 0 && sn.back().empty())
  146.         sn.pop_back();
  147.  
  148.  
  149.     for (int i = 0; i < sn.size(); i++)
  150.     {
  151.         vector<pair<int, int> > filt;
  152.         for (int j = 0; j < sn[i].size(); j++)
  153.         {
  154.             if (sn[i][j].first < n && sn[i][j].second < n)
  155.                 filt.push_back(sn[i][j]);
  156.         }
  157.         sn[i] = filt;
  158.     }
  159.  
  160.     sort_net(n, sn).print();
  161. }
  162.  
  163. bool test(int n)
  164. {
  165.     sn.clear();
  166.     sn.resize(20);
  167.  
  168.     int p2 = 1;
  169.     while (p2 < n)
  170.         p2 *= 2;
  171.     build_sorter(0, p2 - 1, 0);
  172.  
  173.     while (sn.size() > 0 && sn.back().empty())
  174.         sn.pop_back();
  175.  
  176.     for (int i = 0; i < sn.size(); i++)
  177.     {
  178.         vector<pair<int, int> > filt;
  179.         for (int j = 0; j < sn[i].size(); j++)
  180.         {
  181.             if (sn[i][j].first < n && sn[i][j].second < n)
  182.                 filt.push_back(sn[i][j]);
  183.         }
  184.         sn[i] = filt;
  185.     }
  186.  
  187.     sort_net checker(n, sn);
  188.     if (checker.is_sorting())
  189.         return true;
  190.     else
  191.         return false;
  192. }
  193.  
  194. int main()
  195. {
  196.     /*
  197.     for (int i = 1; i <= 16; i++)
  198.     {
  199.         if (!test(i))
  200.             cerr << "i = " << i << "  : PICHALKA" << endl;
  201.     }
  202.     return 0;
  203.     sn.resize(20);
  204.     */
  205.     freopen("netbuild.in", "r", stdin);
  206.     freopen("netbuild.out", "w", stdout);
  207.     int n;
  208.     cin >> n;
  209.     build_net(n);
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement