• 进阶实验6-3.2 社交网络图中结点的“重要性”计算 (30分)-Floyd或dijkstra算法


     

     解题思路:(邻接矩阵存储)

    解法一、用Floyd算法算出每个顶点到其余顶点的最短路径

    #include <stdio.h>
    #include <string.h>
    #define INF 0x3f3f3f3f
    #define MaxV 1001//取10001内存超限
    
    int G[MaxV][MaxV];
    int Nv,Ne;
    void Initial() {
        int i,j;
        memset(G,INF,sizeof(G));
        int v1,v2;
        for(i=0; i<Ne; i++) {
            scanf("%d %d",&v1,&v2);
            G[v1][v2]=1;
            G[v2][v1]=G[v1][v2];
        }
    }
    void Floyd() {
        int i,j,k;
        for(k=1; k<=Nv; k++) {
            for(i=1; i<=Nv; i++) {
                for(j=1; j<=Nv; j++) {
                    if(G[i][k]+G[k][j]<G[i][j])
                        G[i][j]=G[i][k]+G[k][j];
                }
            }
        }
    }
    int sum(int v) {
        int j;
        int sum=0;
        for(j=1; j<=Nv; j++) {
            if(v!=j)
                sum+=G[v][j];
        }
        return sum;
    }
    double Cal(int i) {
        return (Nv-1)/(double)(sum(i));
    }
    int main() {
        scanf("%d %d",&Nv,&Ne);
        int i;
        Initial();
        Floyd();
        int n,x;
        scanf("%d",&n);
        for(i=0; i<n; i++) {
            scanf("%d",&x);
            printf("Cc(%d)=%.2lf
    ",x,Cal(x));
        }
    
        return 0;
    }

    解法二、用dijkstra算法依次求出每个结点到其余结点的最短距离

    #include <stdio.h>
    #include <string.h>
    #define INF 0x3f3f3f3f
    #define MaxVex 1000+10
    int G[MaxVex][MaxVex];
    int visit[MaxVex];
    int Nv,Ne;
    void Init() {
        memset(G,INF,sizeof(G));
        int i;
        for(i=1; i<=Nv; i++) {
            G[i][i]=0;
        }
        int v1,v2;
        for(i=0; i<Ne; i++) {
            scanf("%d %d",&v1,&v2);
            G[v1][v2]=1;
            G[v2][v1]=G[v1][v2];
        }
    }
    void Dijkstra(int s) {
        visit[s]=1;
        int i,j,w,MIN;
        for(j=1; j<=Nv; j++) {
            MIN=INF;
            for(i=1; i<=Nv; i++) {
                if(!visit[i]&&G[s][i]<MIN) {
                    MIN=G[s][i];
                    w=i;
                }
            }
            visit[w]=1;
            for(i=1; i<=Nv; i++) {
                if(!visit[i]&&MIN+G[w][i]<G[s][i]) {
                    G[s][i]=MIN+G[w][i];
                }
            }
        }
    }
    int main() {
        scanf("%d %d",&Nv,&Ne);
        Init();
        int i,j;
        for(i=1; i<=Nv; i++) {
            memset(visit,0,sizeof(visit));
            Dijkstra(i);
        }
        int sum[MaxVex]={0};
        for(i=1; i<=Nv; i++) {
            for(j=1; j<=Nv; j++)
                sum[i]+=G[i][j];
        }
        int n,x;
        scanf("%d",&n);
        for(i=0; i<n; i++) {
            scanf("%d",&x);
            float tmp=(float)(Nv-1)/(float)sum[x];
            printf("Cc(%d)=%.2f
    ",x,tmp);
        }
        return 0;
    }
  • 相关阅读:
    解决Mac笔记本电脑自带录屏软件没有声音问题
    pip安装包后Import的时候提示找不到的解决方案
    Photoshop怎么给图片添加简介信息或者版权信息
    [2021/08/06]Ubuntu20 安装指定小版本Mysql(本文示例mysql8.0.18)
    Springboot2.3.5 实现JWT授权验证并针对不同用户实现多个拦截器
    搭建集群步骤注意事项
    docker服务程序网络排查
    网络分层协议集合分析
    括号串
    抢救实验数据
  • 原文地址:https://www.cnblogs.com/snzhong/p/12532539.html
Copyright © 2020-2023  润新知