Advertisement
hugol

Untitled

Apr 14th, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.48 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <map>
  4. #include <list>
  5. #include <time.h>
  6. #include <assert.h>
  7.  
  8. using namespace std;
  9.  
  10. const double eps = 1e-12; // stała przybliżenia zera
  11. double d = 0.85;
  12.  
  13. bool gauss(vector <vector<double>> &AB, vector<double> &X)
  14. {
  15.     int i,j,k,n;
  16.     double m,s;
  17.     n=AB.size(); // ilosc wierszy
  18.  
  19.     /* usuwanie zer z przekatnej*/
  20.     for(i = 0; i < n - 1; i++)
  21.     {
  22.         if(abs(AB[i][i]) < eps) // 0
  23.         {
  24.             for(j = 0; j < n - 1; j++)
  25.             {
  26.                 if (j==i)
  27.                     continue;
  28.                 if (AB[j][i] >= eps && AB[i][j] >= eps)
  29.                 {
  30.                     vector<double> tmp = AB[i];
  31.                     AB[i] = AB[j];
  32.                     AB[j] = tmp;
  33.                     i = 0;
  34.                 }
  35.             }
  36.         }
  37.     }
  38.  
  39.  
  40.     // eliminacja
  41.     for(i = 0; i < n - 1; i++)
  42.     {
  43.         for(j = i + 1; j < n; j++)
  44.         {
  45.             // zero na przekatnej
  46.             if(fabs(AB[i][i]) < eps) return false;
  47.             m = -AB[j][i] / AB[i][i];
  48.             for(k = i + 1; k <= n; k++)
  49.                 AB[j][k] += m * AB[i][k];
  50.         }
  51.     }
  52.  
  53.     // wyliczanie niewiadomych
  54.     for(i = n - 1; i >= 0; i--)
  55.     {
  56.         s = AB[i][n];
  57.         for(j = n - 1; j >= i + 1; j--)
  58.             s -= AB[i][j] * X[j];
  59.         // zero na przekatnej
  60.         if(fabs(AB[i][i]) < eps) return false;
  61.         X[i] = s / AB[i][i];
  62.     }
  63.     return true;
  64. }
  65.  
  66. bool wczytaj(map<int, int> &backNodes, vector <double> &ilosc, vector< vector<double> > &macierz_sasiedztwa)
  67. {
  68.     int currId = 0;
  69.  
  70.     int src, dst;
  71.     int count = 0;
  72.  
  73.     map<int, int> Nodes;
  74.  
  75.     while (!cin.eof())
  76.     {
  77.         cin >> src >> dst;
  78.         if (cin.eof() || src == -1)
  79.             break;
  80.  
  81.         // mapy id
  82.         if (Nodes.find(src) == Nodes.end())
  83.         {
  84.             Nodes[src] = currId;
  85.             backNodes[currId] = src;
  86.             currId++;
  87.         }
  88.         if (Nodes.find(dst) == Nodes.end())
  89.         {
  90.             Nodes[dst] = currId;
  91.             backNodes[currId] = dst;
  92.             currId++;
  93.         }
  94.  
  95.         /* powiekszanie wektorow*/
  96.         if (Nodes[src] > count)
  97.             count = Nodes[src];
  98.         if (Nodes[dst] > count)
  99.             count = Nodes[dst];
  100.         while(ilosc.size() <= count)
  101.             ilosc.push_back( 0 );
  102.         while(macierz_sasiedztwa.size() <= count)
  103.         {
  104.             macierz_sasiedztwa.push_back(vector<double>());
  105.         }
  106.         for(int i=0; i<macierz_sasiedztwa.size(); i++)
  107.         {
  108.             while (macierz_sasiedztwa[i].size() <= count)
  109.             {
  110.                 macierz_sasiedztwa[i].push_back( 0 );
  111.             }
  112.         }
  113.  
  114.         // ustawienie macierzy
  115.         ilosc[Nodes[src]]++;
  116.         macierz_sasiedztwa[Nodes[dst]][Nodes[src]] = 1;
  117.  
  118.     }
  119.  
  120.     return true;
  121. }
  122.  
  123. void wypisz_macierz(vector< vector<double> > &sasiedztwo)
  124. {
  125.     for(int i=0; i<sasiedztwo.size(); i++)
  126.     {
  127.         for(int j=0; j<sasiedztwo[i].size(); j++)
  128.         {
  129.             cout << sasiedztwo[i][j] << "\t";
  130.         }
  131.         cout << endl;
  132.     }
  133. }
  134.  
  135. void pomnoz_razy_macierz_diagonalna(vector<double> &ilosc, vector< vector<double> > &sasiedztwo)
  136. {
  137.  
  138.     for(int i=0; i<ilosc.size(); i++)
  139.     {
  140.         // dodanie krawedzi do wszystkich
  141.         if (!(ilosc[i] > 0))
  142.         {
  143.             ilosc[i] = sasiedztwo[i].size()-1;
  144.             for (int j=0; j<sasiedztwo[i].size(); j++)
  145.             {
  146.                 if (i==j)
  147.                     continue;
  148.                 sasiedztwo[j][i] = 1;
  149.             }
  150.         }
  151.  
  152.         for(int j=0; j<sasiedztwo[i].size(); j++)
  153.         {
  154.             sasiedztwo[j][i] *= d/ilosc[i];
  155.         }
  156.     }
  157. }
  158.  
  159. void dodaj_kolumne(vector< vector<double> > &sasiedztwo)
  160. {
  161.     for(int i=0; i<sasiedztwo.size(); i++)
  162.     {
  163.         sasiedztwo[i].push_back( (1.0-d) / double(sasiedztwo.size()) );
  164.     }
  165. }
  166.  
  167. void I_odj_macierz(vector< vector<double> > &sasiedztwo)
  168. {
  169.     for(int i=0; i<sasiedztwo.size(); i++)
  170.     {
  171.         for(int j=0; j<sasiedztwo[i].size(); j++)
  172.         {
  173.             sasiedztwo[i][j] = 0-sasiedztwo[i][j];
  174.             sasiedztwo[i][j] += i==j;
  175.         }
  176.     }
  177. }
  178.  
  179. void wczytaj_uklad(vector< vector<double> > &sasiedztwo)
  180. {
  181.     // 0 1 1  1
  182.     // 1 0 1  1
  183.     // 1 1 1  1
  184.  
  185.     vector<double> wiersz;
  186.  
  187.     wiersz.clear();
  188.     wiersz.push_back ( 0 );
  189.     wiersz.push_back ( 1 );
  190.     wiersz.push_back ( 1 );
  191.     wiersz.push_back ( 1 );
  192.     sasiedztwo.push_back(wiersz);
  193.  
  194.     wiersz.clear();
  195.     wiersz.push_back ( 1 );
  196.     wiersz.push_back ( 0 );
  197.     wiersz.push_back ( 1 );
  198.     wiersz.push_back ( 1 );
  199.     sasiedztwo.push_back(wiersz);
  200.  
  201.     wiersz.clear();
  202.     wiersz.push_back ( 1 );
  203.     wiersz.push_back ( 1 );
  204.     wiersz.push_back ( 1 );
  205.     wiersz.push_back ( 1 );
  206.  
  207.     sasiedztwo.push_back(wiersz);
  208. }
  209.  
  210. void wczytaj_uklad2(vector< vector<double> > &sasiedztwo)
  211. {
  212.     // 1 0 1  1
  213.     // 0 1 1  1
  214.     // 1 0 1  1
  215.  
  216.     vector<double> wiersz;
  217.  
  218.     wiersz.clear();
  219.     wiersz.push_back ( 1 );
  220.     wiersz.push_back ( 0 );
  221.     wiersz.push_back ( 1 );
  222.     wiersz.push_back ( 1 );
  223.     sasiedztwo.push_back(wiersz);
  224.  
  225.     wiersz.clear();
  226.     wiersz.push_back ( 0 );
  227.     wiersz.push_back ( 1 );
  228.     wiersz.push_back ( 1 );
  229.     wiersz.push_back ( 1 );
  230.     sasiedztwo.push_back(wiersz);
  231.  
  232.     wiersz.clear();
  233.     wiersz.push_back ( 1 );
  234.     wiersz.push_back ( 0 );
  235.     wiersz.push_back ( 1 );
  236.     wiersz.push_back ( 1 );
  237.  
  238.     sasiedztwo.push_back(wiersz);
  239. }
  240.  
  241.  
  242. //#define WLASNA
  243.  
  244. int main()
  245. {
  246.     vector< vector<double> > sasiedztwo;
  247.     vector<double> ilosc;
  248.     map<int, int> Nodes;
  249.  
  250. #ifndef WLASNA
  251.     wczytaj(Nodes, ilosc, sasiedztwo); 
  252. #endif
  253. #ifdef WLASNA
  254.     wczytaj_uklad(sasiedztwo); // wczytanie wlasnego ukl rownan
  255. #endif
  256.  
  257.     time_t now;
  258.     time(&now);
  259.  
  260. #ifndef WLASNA
  261.     pomnoz_razy_macierz_diagonalna(ilosc, sasiedztwo);
  262.     I_odj_macierz(sasiedztwo);
  263. #endif
  264.  
  265.     dodaj_kolumne(sasiedztwo);
  266.  
  267.     vector<double> Y;
  268.     for(int i=0; i<sasiedztwo.size(); i++)
  269.         Y.push_back( 0 );
  270.  
  271.     bool done;
  272.     done = gauss( sasiedztwo, Y);
  273.  
  274.     time_t seconds = time(NULL) - now;
  275.  
  276.     assert(done);
  277. #ifndef WLASNA
  278.     if (done)
  279.     {
  280.         double sumRank = 0;
  281.         for(int i=0; i<Y.size(); i++)
  282.         {
  283.             cout << Nodes[i] << "\trank:\t" << Y[i] << endl;
  284.             sumRank += Y[i];
  285.         }
  286.  
  287.         cout << "nodes: " << Y.size() << endl;
  288.         cout << "rank sum: " << sumRank << endl;
  289.         cout << "seconds: " << seconds << endl;
  290.     }
  291. #endif
  292.  
  293.     return 0;
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement