案例6-1.6 哈利·波特的考试 (25分)-dijkstra

 

 解题思路:

1、对每个顶点,用dijkstra算法求得单源最短路径

2、再从每个顶点到其他顶点选出最长路径

3、从最长路径中选出最小的顶点

#include <stdio.h>
#include <string.h>
#define INF 0x3f3f3f3f
#define MaxVex 100+1
int G[MaxVex][MaxVex];
int visit[MaxVex]= {0};
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,x;
    for(i=0; i<Ne; i++) {
        scanf("%d %d %d",&v1,&v2,&x);
        G[v1][v2]=x;
        G[v2][v1]=G[v1][v2];
    }
}

void Dijkstra(int s) {//求单源最短路径
    int i,j,w;
    for(i=1; i<=Nv; i++) {
        visit[i]=0;
    }
    visit[s]=1;
    for(j=1; j<=Nv; j++) {
        int 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]&&G[w][i]+MIN<G[s][i]) {
                G[s][i]=G[w][i]+MIN;
            }
        }
    }
}
int main() {
    scanf("%d %d",&Nv,&Ne);
    Init();
    int i,j;
    for(i=1; i<=Nv; i++) {
        Dijkstra(i);
    }
    int flag[MaxVex]={0};
    int max[MaxVex]= {-1};
    for(i=1; i<=Nv; i++) {//求单源最短路径中最长路径
        for(j=1; j<=Nv; j++) {
            if(G[i][j]!=INF) {
                if(G[i][j]>max[i])
                    max[i]=G[i][j];
            }
            if(G[i][j]==INF)
            {
                flag[i]=1;
            }

        }
    }
    int cnt=0;
    for(i=1; i<=Nv; i++) {
        if(!flag[i])
            break;
    }
    if(i>Nv)
        printf("0");
    else {
        int m=1;
        for(i=1; i<=Nv; i++) {
            if(max[i]<max[m]) {
                m=i;
                cnt=1;
            } else if(max[i]==max[m]) {
                cnt++;
            }
        }
        printf("%d %d",m,max[m]);

    }
}

猜你喜欢

转载自www.cnblogs.com/snzhong/p/12520032.html