您的位置:首页 > 其它

HDU 5097 Page Rank(模拟,矩阵运算)

2014-11-16 11:49 351 查看
题目:Page Rank

题意:有点难读懂,我是跟着图YY的。

输入一个N*N的01矩阵A,先将它转换成类似图片里面的矩阵S。

具体做法是,对于第i行,求出1的个数cnt,然后如果A[i][j]是1,B[j][i]就等于1/cnt,否则等于0。注意这里i , j前后是相反的。

然后根据题目里面的公式求出G矩阵,U是一个全1的矩阵。

跟着就是搞一个q的N行1列的矩阵,按照题目要求迭代就行。

当然这里有个让人纳闷的地方,就是q的初始值的问题,貌似没说。我就随便全部设成1过了,不知道是不是无论什么初始值最后都会收敛到同一个地方还是怎么样。

#include<cstdio>
#include<cstring>
#include<cmath>
const double alpha = 0.85;
const double eps = 1e-10;
const int N = 3010;
int n;
double mat

, q[2]
;
inline double sqr(double x){
return x*x;
}
bool ok(){
double s = 0.0;
for(int i=0; i<n; i++)  s += sqr(q[0][i]-q[1][i]);
return fabs(s)<eps;
}
char s
;
int main(){
while(~scanf("%d", &n)){
double b = (1.0-alpha)/n;
for(int i=0; i<n; i++){
scanf("%s", s);
int m = 0;
for(int j=0; j<n; j++)  m += s[j]-'0';
for(int j=0; j<n; j++){
mat[j][i] = s[j]=='0'?0.0:(1.0/m);
mat[j][i] = mat[j][i]*alpha + b;
}
q[1][i] = 0.0;
q[0][i] = 1.0;
}
bool f = 0;
while(!ok()){
for(int i=0; i<n; i++){
q[f^1][i] = 0.0;
for(int j=0; j<n; j++){
q[f^1][i] += mat[i][j] * q[f][j];
}
}
f^=1;
}
for(int i=0; i<n; i++){
if(i)   putchar(' ');
printf("%.2f", q[f][i]);
}
puts("");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: