首页 > 代码库 > HDOJ 题目5097 Page Rank(矩阵运算,模拟)
HDOJ 题目5097 Page Rank(矩阵运算,模拟)
Page Rank
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others)Total Submission(s): 280 Accepted Submission(s): 75
For simplicity, in this problem PageRank vector q is defined as q = Gq, Where , S is the destination-by-source stochastic matrix, U is all one matrix, n is the number of nodes and α is the weight between 0 and 1 (here we use 0.85).
For the example on the right, we have:
Denote the current PageRank vector and the next PageRank vector by qcur and qnext respectively. The process is to compute the iterative powering for finding the first eigenvector.
The computation ends until for some small ε(10-10).
For each case, there are multiple lines. The first line contains an integer N(N<=3000), which represents the number of pages. Then a N*N zero-one matrix follows. The element Eij (0 <= i, j < N) on the matrix represents whether the i-th page has a hyper link to the j-th page.
4 0111 0011 0001 0100
0.15 1.49 0.83 1.53
field=problem&key=2014%C9%CF%BA%A3%C8%AB%B9%FA%D1%FB%C7%EB%C8%FC%A1%AA%A1%AA%CC%E2%C4%BF%D6%D8%CF%D6%A3%A8%B8%D0%D0%BB%C9%CF%BA%A3%B4%F3%D1%A7%CC%E1%B9%A9%CC%E2%C4%BF%A3%A9&source=1&searchmode=source" style="color:rgb(26,92,200); text-decoration:none">2014上海全国邀请赛——题目重现(感谢上海大学提供题目)
pid=5379" target="_blank" style="color:rgb(26,92,200); text-decoration:none">5379
pid=5378" target="_blank" style="color:rgb(26,92,200); text-decoration:none">5378
pid=5377" target="_blank" style="color:rgb(26,92,200); text-decoration:none">5377
pid=5376" target="_blank" style="color:rgb(26,92,200); text-decoration:none">5376
pid=5375" target="_blank" style="color:rgb(26,92,200); text-decoration:none">5375
Problem : 5097 ( Page Rank ) Judge Status : Accepted RunId : 14492913 Language : C++ Author : lwj1994 Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta #include<stdio.h> #include<string.h> #include<math.h> #define eps 1e-10 char map[3030]; double ans[3030][3030]; double q[2][3030]; int n; void muti(double a[][3030],double num) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) a[i][j]*=num; } } void add(double a[][3030],double b[][3030]) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) a[i][j]+=b[i][j]; } } int jud() { double ans=0; int i; for(i=0;i<n;i++) { ans+=(q[0][i]-q[1][i])*(q[0][i]-q[1][i]); } //ans=sqrt(ans); if(fabs(ans)<eps) return 1; return 0; } int main() { //int n; while(scanf("%d",&n)!=EOF) { int i,j; double a=0.85; memset(ans,0,sizeof(ans)); for(i=0;i<n;i++) { int sum=0; scanf("%s",&map); for(j=0;j<n;j++) { if(map[j]=='1') sum++; //U[i][j]=1; } for(j=0;j<n;j++) { if(map[j]=='1') ans[j][i]=1.0/sum; } } muti(ans,a); // muti(U,1.0/n*(0.15)); // printf("\n"); // add(ans,U); for(i=0;i<n;i++) for(j=0;j<n;j++) ans[i][j]+=(0.15/n); int p=0; for(i=0;i<n;i++) { q[p][i]=1; q[p^1][i]=0; } //mmuti(q[p],ans,q[p^1]); //p^=1; while(!jud()) { //q[p^1]=mmuti(q[p],ans); for(i=0;i<n;i++) { q[p^1][i]=0; for(j=0;j<n;j++) q[p^1][i]+=q[p][j]*ans[i][j]; } p^=1; } printf("%.2lf",q[p][0]); for(i=1;i<n;i++) { printf(" %.2lf",q[p][i]); } printf("\n"); } }
HDOJ 题目5097 Page Rank(矩阵运算,模拟)