Advertisement
hugol

Untitled

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