Advertisement
bartekltg

[kug]

May 13th, 2014
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <utility>
  5.  
  6. using namespace std;
  7.  
  8.  
  9. class polaczenie
  10. {public:
  11.     int i,j;
  12.     int koszt;
  13.     bool operator < (const polaczenie& other ) const {return koszt<other.koszt;}
  14.     polaczenie (int ii,int jj,int k):i(ii),j(jj),koszt(k){}
  15. };
  16.  
  17.  
  18. int main()
  19. {
  20.  
  21.     int n;
  22.     cin.sync_with_stdio(false);
  23.  
  24.     cin>>n;
  25.  
  26.     //generator zośliwego przypadku
  27.     /*cout<<n<<endl;
  28.     for (int i=1;i<=n;i++)
  29.     {
  30.         //if (i<n) cout<<"1 ";
  31.         for(int j=i;j<=n-1;j++)
  32.         {
  33.             cout<<j-i+1<<" ";
  34.         }
  35.         cout<<2*n<<" "<<endl;
  36.     }
  37.     return 0;*/
  38.  
  39.  
  40.     vector <polaczenie> polaczenia;
  41.     polaczenia.reserve((n+2)*(n+2)/2);
  42.  
  43.     for (int i=1;i<=n;i++)
  44.         for(int j=i;j<=n;j++)
  45.         {
  46.             int c;
  47.             cin>>c;
  48.         //    C[i][j]=c;
  49.             polaczenia.emplace_back(i,j,c);
  50.         }
  51.  
  52.  
  53.     sort(polaczenia.begin(),polaczenia.end());
  54.  
  55.     vector<int> konce(n+1,0);  // koniec[i]=j oznacza belkę i-j.
  56.  
  57.     int wymiar=0;
  58.     int index=0;
  59.     int64_t koszt=0;
  60.     while (wymiar<n)
  61.     {
  62.         polaczenie belka = polaczenia[index];
  63.         index++;
  64.  
  65.         while ( konce[belka.i]!=0 )
  66.         {
  67.             if (konce[belka.i]==belka.j)
  68.             {
  69.              //   cout<<"jest"<<endl;
  70.                 belka.i=0;
  71.                 break;
  72.             }
  73.  
  74.             int M,m;
  75.             if (konce[belka.i]>belka.j)
  76.             {
  77.                 M=konce[belka.i];
  78.                 m=belka.j;
  79.             }else
  80.             {
  81.                 m=konce[belka.i];
  82.                 M=belka.j;
  83.             }
  84.  
  85.             //heurystyka walczaca z O(n^3)
  86.             //chcemy, aby belka bazowa zajmowałą z grubsza
  87.             //polowę miejsca miedzy swoim początkiem a końcem.
  88.             if ( abs(M-(belka.i+n/2))<abs(m-(belka.i+n/2) ) )
  89.                  konce[belka.i]=M;
  90.             else
  91.                  konce[belka.i]=m;
  92.             //nie wiemy jeszcze, czy belka wejdzie do bazy, ale
  93.             //jeśli nie wejdzie, tzn była liniiowo zależna od bazy
  94.             // - mamy prawo ją odjąć.
  95.  
  96.  
  97.             belka.i=m+1;
  98.             belka.j = M;
  99.  
  100.  
  101.         }
  102.         if (belka.i!=0)
  103.         {
  104.             konce[belka.i]=belka.j;
  105.             wymiar++;
  106.             koszt+=belka.koszt;
  107.         }
  108.  
  109.     }
  110.  
  111.  
  112.     cout<<koszt<<endl;
  113.  
  114.  
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement