Advertisement
osipyonok

PageRankLab

Oct 20th, 2016
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.98 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> Gauss(MATRIX A , vector<double> B){//Gauss
  84.     vector<double> X(n);
  85.     vector<bool> isZero(n , 0);
  86.     rep(j , n){
  87.         if(isZero[j])continue;
  88.         double k = A[j][j];
  89.         rep(i , n){
  90.             A[j][i] /= k;
  91.         }
  92.         B[j] /= k;
  93.         repf(i , j + 1 , n){
  94.             double k = A[i][j] / A[j][j];
  95.             rep(r , n){
  96.                 A[i][r] -= k * A[j][r];
  97.             }
  98.            
  99.             B[i] -= k * B[j];
  100.         }
  101.         rep(ii , n){
  102.             rep(jj , n){
  103.                 if(abs(A[ii][jj]) > eps){isZero[ii] = 0; break;}else isZero[ii] = 1;
  104.             }
  105.         }
  106.     }
  107.     repn(i , n){
  108.         if(isZero[i]){
  109.             X[i] = 1.;
  110.             continue;
  111.         }
  112.         double res = B[i];
  113.         repf(j , i + 1 , n){
  114.             res -= A[i][j] * X[j];
  115.         }
  116.         res /= A[i][i];
  117.         X[i] = res;
  118.         if(X[i] == -0.)X[i] = 0;
  119.     }
  120.  
  121.     return X;
  122. }
  123.  
  124.  
  125. inline vector<double> PageRank(MATRIX G){
  126.     Transpose(G);
  127.     rep(i , n)G[i][i] -= 1;
  128.     vector<double> v = Gauss(G , vector<double>(n , 0.));
  129.     double norm = l_Norm(v);
  130.     rep(i , n)v[i] /= norm;
  131.     return v;
  132. }
  133. /*
  134. inline vector<double> Inverse_Iteration(MATRIX A){
  135.     double lambda = 1;
  136.     vector<double> X(MAXN , 1);
  137.     vector<double> Y(MAXN , 1);
  138.     rep(i , n){
  139.         A[i][i] -= lambda;
  140.     }
  141.     int cnt = 0;
  142.     do{
  143.         X = Y;
  144.         Y = Gauss(A , X);
  145.         double norm = EuclideanNorm(Y);
  146.         rep(i , n)Y[i] /= norm;
  147.         rep(i , n)cout << Y[i] << " ";
  148.         cout << nl;
  149.     //  cout << "hi\n";
  150.         if(++cnt > 100)break;
  151.     }while(EuclideanNorm(Substract(X , Y)) > eps);
  152.     return Y;
  153. }*/
  154.  
  155. int main() {
  156.     ios_base::sync_with_stdio(false);
  157.     cin.tie(NULL);
  158.     cout.precision(3);
  159.     cout.setf(ios::fixed);
  160.     cin >> n >> m;
  161.     rep(i , m){
  162.         int u , v;
  163.         cin >> u >> v;
  164.         --u;
  165.         --v;
  166.         g[u].pb(v);
  167.     }
  168.     Build_H();
  169.     Build_G();
  170.     rep(i , n){
  171.         rep(j , n){
  172.             cout << setw(4) << G[i][j] << " ";
  173.         }
  174.         cout << nl;
  175.     }
  176.     cout << nl;
  177.     vector<double> v = PageRank(G);
  178.     rep(i , n)cout << setw(4) << v[i] << " ";
  179.  
  180.     return 0;
  181. }
  182. /*
  183. 6 10
  184. 1 2
  185. 1 3
  186. 3 1
  187. 3 2
  188. 3 5
  189. 4 5
  190. 4 6
  191. 5 4
  192. 5 6
  193. 6 4
  194. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement