問題解決のアイデア:
図1は、各頂点のために、単一始点最短経路アルゴリズムダイクストラによって決定しました
次いで2、及び他の頂点に各頂点から最長パスを選択
3、最長経路から最小の頂点を選択します
する#include <stdio.hに> する#include < 文字列・H> に#define INF 0x3f3f3f3f の#define MaxVex 100 + 1 INT G [MaxVex] [MaxVex]。 INT訪問[MaxVex] = { 0 }。 int型のNv、ネ。 ボイドは、init(){//图初始化-邻接矩阵 のmemset(G、INF、はsizeof (G))。 int型私は、 以下のための式(I = 1 ; I <=ネバダ州; I ++ ){ G [i]は[I] = 0 ; } int型のV1、V2、X。 以下のための式(I = 0、I <数Neと、I ++ ){ scanf関数(" %D%D%D "、&V1&V2&X) G [V1] [V2] = X。 G [V2] [V1] = G [V1]、[V2]。 } } ボイドダイクストラ(INT S){//求单源最短路径 INT I、J、W。 以下のための式(I = 1 ; I <=ネバダ州; I ++ ){ 訪問[I] = 0 ; } 訪問[S] = 1 。 用(J = 1 ; J <= Nvの; J ++ ){ int型 MIN = INF。 ための式(I = 1 ; I <= Nvと、I ++){ もし!(訪問[I] && G [S] [I] < MIN){ MIN = G [S] [I]。 W = I; } } 訪問[W] = 1 。 ための式(I = 1 ; I <= Nvのは、I ++ ){ 場合(!訪問[i]は&& G [I] + MIN <[W] G [S] [I]){ G [S] [I] = G [ ] [I] + W MIN。 } } } } int型のmain(){ scanf関数(" %D%D "、およびNV、&NE)。 初期化(); int型私は、jは、 以下のための式(I = 1 ; I <=ネバダ州; I ++ ){ ダイクストラ(I)。 } int型のフラグ[MaxVex] = { 0 }。 INTマックス[MaxVex] = { - 1 }。 以下のための(iは= 1 ; I <= Nvの; I ++ ){//求单源最短路径中最长路径 ため(J = 1 ; J <= Nvの; J ++ ){ 場合(G [I] [J] =!INF){ 場合(G [I] [J]> )[i]の最大 maxの[I] = G [I] [J]。 } もし(G [I] [J] == INF) { フラグ[I] maxの[M]){ = 1 。 } } } int型 CNT = 0 。 以下のための(iは= 1 ; I <= NvのI ++ ){ 場合(!フラグ[i])と ブレーク。 } もし(I> NV) のprintf(" 0 " )。 他{ INT、M = 1 。 以下のための式(I = 1 ; I <=ネバダ州; I ++ ){ 場合(MAX [i]が< = mは私; CNT = 1 。 } そう であれば(MAX [I] == maxの[M]){ CNT ++ 。 } } のprintf(" %D%D " 、M、マックス[M])。 } }