特征向量中心性(从文献中摘抄)

特征向量的方法不仅考虑节
点邻居数量还考虑了其质量对节点重要性的影响.

   重要的参考文献: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 
",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];
    }
}
原文地址:https://www.cnblogs.com/miaobo/p/12485574.html