特征向量的方法不僅考慮節
點鄰居數量還考慮了其質量對節點重要性的影響.

重要的參考文獻:https://blog.csdn.net/yyl424525/article/details/103108506?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
用上述參考文獻寫出代碼(存在問題,無法結束循環)
//計算特征向量中心性 void EigenvectorCentrality(ALGraph* G) { //先定義x[vexnum];並將初值設置為他們的度 int x[G->vexnum]; int y[G->vexnum];//保留上一次的x[i] int flag=0;//判斷是否AX=λX //先把度初始化給x[i] for(int i=0;i<G->vexnum;i++) { EdgeNode* s; x[i]=G->adjlist[i].degree; s=G->adjlist[i].firstedge; } //循環執行Ax=x操作,直到AX=λX do{ //先把上一次的x[i]交給y[i] for(int k=0;k<G->vexnum;k++) { y[k]=x[k]; } //計算這一個的x[i] for(int j=0;j<G->vexnum;j++) { EdgeNode* s; s=G->adjlist[j].firstedge; x[j]=0; while(s!=NULL) { x[j]+=y[s->adjvex];//用的是上一次的x[i](即y[i])進行相加 s=s->next; } printf("x[%d]=%d \n",j,x[j]); } //判斷這一次的x[i]/x[i-1],各個節點的結果是否相同 for(int m=1;m<G->vexnum-1;m++) { if(x[m]/y[m]!=x[m-1]/y[m-1]) break; if(x[m]/y[m]==x[m-1]/y[m-1]&&m==G->vexnum-1) flag=1; } }while(flag!=1); for(int n=0;n<G->vexnum;n++) { printf("%d ",x[n]); } }
正確的寫法:
//計算特征向量中心性 void eigenvector_centrality(ALGraph *G) { float e[G->vexnum];//記錄上一次的指標(最終的特征向量中心性指標 ,因為會把最終的計算賦值給e);下面都用指標代表特征向量指標 float e1[G->vexnum];//記錄這一次的指標 float max = 0;//這一次的最大指標 float max1 = 0;//記錄上一次最大指標 int flag=0;//當flag=1時,代表找到各個指標 for(int i=0; i<G->vexnum; i++) { e[i]=1;//將每個點初始化為1 e1[i]=0; } EdgeNode *p; p=(EdgeNode*)malloc(sizeof(EdgeNode)); //循環開始 while(flag==0) { max1=max;//max1為上一次的最大值 max=0; for (int i=0; i<G->vexnum; i++) { p=G->adjlist[i].firstedge; while(p!=NULL) { e1[i]+=e[p->adjvex];//第一次的計算結果為他們各自的度 p=p->next; } if(e1[i]>max) max=e1[i];//記錄本次的最大指標 } for(int i=0; i<G->vexnum; i++) { if(e[i]!=e1[i]) break; if(i==G->vexnum-1) flag=1;//兩次計算結果相同結束循環 } if((1.0/max1-1.0/max)<0.01&&(1.0/max1-1.0/max)>-0.01) flag=1;//當差值較小時也可結束循環 //保留這次的結果到e中,並且將ei重置為0,方便下次計算 for(int i=0; i<G->vexnum; i++) { e[i]=e1[i]; e1[i]=0; } } for(int i=0; i<G->vexnum; i++) { e[i]=e[i]/max; G->adjlist[i].ec=e[i]; } }