Advertisement
osipyonok

PageRankLab2

Oct 26th, 2016
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define INF 1000010000
  4. #define nl '\n'
  5. #define pb push_back
  6. #define ppb pop_back
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define pii pair<int,int>
  11. #define pdd pair<double,double>
  12. #define all(c) (c).begin(), (c).end()
  13. #define SORT(c) sort(all(c))
  14. #define sz(c) (c).size()
  15. #define rep(i,n) for( int i = 0; i < n; ++i )
  16. #define repi(i,n) for( int i = 1 ; i <= n; ++i )
  17. #define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
  18. #define repf(j,i,n) for( int j = i ; j < n ; ++j )
  19. #define die(s) {std::cout << s << nl;}
  20. #define dier(s) {std::cout << s; return 0;}
  21. #define vi vector<int>
  22. typedef long long ll;
  23. #define MATRIX vector<vector<double> >
  24. #define MAXN 5050
  25. #define alpha 0.85
  26. #define eps 1e-7
  27. using namespace std;
  28. //теория http://pidruchniki.com/71830/informatika/algoritm_pagerank
  29. //http://www.cyberguru.ru/programming/programming-theory/matrix-vectors-values-page2.html
  30. //http://info.alnam.ru/book_clm.php?id=64
  31. int n , m; //n - cтраниц, m - ссылок
  32. vi g[MAXN];
  33. MATRIX H(MAXN , vector<double>(MAXN , 0.));
  34. vector<bool> a(MAXN , 0);
  35. MATRIX G(MAXN , vector<double>(MAXN , 0.));
  36.  
  37. inline double EuclideanNorm(vector<double> v){
  38.     double sum = 0;
  39.     rep(i , sz(v))sum += v[i] * v[i];
  40.     return sqrt(sum);
  41. }
  42.  
  43. inline double l_Norm(vector<double> v){
  44.     double sum = 0;
  45.     rep(i , n)sum += abs(v[i]);
  46.     return sum;
  47. }
  48.  
  49. inline vector<double> Substract(vector<double> & a , vector<double> & b){
  50.     vector<double> res(n , 0.);
  51.     rep(i , n)res[i] = a[i] - b[i];
  52.     return res;
  53. }
  54.  
  55. inline void Build_H(){
  56.     rep(i , n){
  57.         a[i] = !sz(g[i]);
  58.         double cur = 1. / (double)sz(g[i]);
  59.         for(int j : g[i]){
  60.             H[i][j] = cur;
  61.         }
  62.     }      
  63. }
  64.  
  65. inline void Build_G(){
  66.     rep(i , n){
  67.         double t = (alpha * a[i] + (1 - alpha)) / (double)n;
  68.         rep(j , n){
  69.             G[i][j] = alpha * H[i][j];
  70.             G[i][j] += t;
  71.         }
  72.     }
  73. }
  74.  
  75. inline void Transpose(MATRIX & A){
  76.     rep(i , n){
  77.         repf(j , i + 1 , n){
  78.             swap(A[i][j] , A[j][i]);
  79.         }
  80.     }
  81. }
  82.  
  83. inline vector<double> MultV(MATRIX A , vector<double> v){
  84.     vector<double> ans(sz(v) , 0);
  85.     rep(i , sz(v)){
  86.         rep(j , sz(v)){
  87.             ans[i] += A[i][j] * v[j];    
  88.         }
  89.     }
  90.     return ans;
  91. }
  92.  
  93. inline vector<double> Step(MATRIX G){
  94.     vector<double> X(n , 1);
  95.     vector<double> Y(n , 1);
  96.     double cur_lambda1 , cur_lambda2 = INF;
  97.     do{
  98.         X = Y;
  99.         cur_lambda1 = cur_lambda2;
  100.         Y = MultV(G , Y);
  101.         int pos = 0;
  102.         while(abs(X[pos]) < eps)++pos;
  103.         cur_lambda2 = Y[pos] / X[pos];
  104.         double norm = l_Norm(Y);
  105.         rep(i , n)Y[i] /= norm;
  106.  
  107.     }while(abs(cur_lambda1 - cur_lambda2) > eps);
  108.     return X;
  109. }
  110.  
  111. inline vector<double> PageRank(MATRIX G){
  112.     Transpose(G);
  113.  
  114. //  rep(i , n)G[i][i] -= 1;
  115.     vector<double> v = Step(G);//Gauss(G , vector<double>(n , 0.));
  116. //  double norm = l_Norm(v);
  117. //  rep(i , n)v[i] /= norm;
  118.     return v;
  119. }
  120. /*
  121. inline vector<double> Inverse_Iteration(MATRIX A){
  122.     double lambda = 1;
  123.     vector<double> X(MAXN , 1);
  124.     vector<double> Y(MAXN , 1);
  125.     rep(i , n){
  126.         A[i][i] -= lambda;
  127.     }
  128.     int cnt = 0;
  129.     do{
  130.         X = Y;
  131.         Y = Gauss(A , X);
  132.         double norm = EuclideanNorm(Y);
  133.         rep(i , n)Y[i] /= norm;
  134.         rep(i , n)cout << Y[i] << " ";
  135.         cout << nl;
  136.     //  cout << "hi\n";
  137.         if(++cnt > 100)break;
  138.     }while(EuclideanNorm(Substract(X , Y)) > eps);
  139.     return Y;
  140. }*/
  141.  
  142. int main() {
  143.     ios_base::sync_with_stdio(false);
  144.     cin.tie(NULL);
  145.     cout.precision(3);
  146.     cout.setf(ios::fixed);
  147.     cin >> n >> m;
  148.     rep(i , m){
  149.         int u , v;
  150.         cin >> u >> v;
  151.         --u;
  152.         --v;
  153.         g[u].pb(v);
  154.     }
  155.     Build_H();
  156.     Build_G();
  157.     rep(i , n){
  158.         rep(j , n){
  159.             cout << setw(4) << G[i][j] << " ";
  160.         }
  161.         cout << nl;
  162.     }
  163.     cout << nl;
  164.     vector<double> v = PageRank(G);
  165.     rep(i , n)cout << setw(4) << v[i] << " ";
  166.  
  167.     return 0;
  168. }
  169. /*
  170. 6 10
  171. 1 2
  172. 1 3
  173. 3 1
  174. 3 2
  175. 3 5
  176. 4 5
  177. 4 6
  178. 5 4
  179. 5 6
  180. 6 4
  181. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement