解题思路:
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]); } }