思路:
一开始根本没看懂题目,看了其他代码后才知道。
- 首先通过Floyd算法求得任意两个结点之间的最短距离。
- 对于某个结点,遍历其与其他结点的最大距离,得到该结点到其他结点的最大最短路径。
- 求得所有结点的最大最短路径。(找到最难变的那种动物)
- 在所有的最大最短路径中找到最小值即为解。(魔咒最短)
代码:
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 105
#define INF 1e9
int G[MAXN][MAXN]={0},n;
void create(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j)
G[i][j]=0;
else
G[i][j]=INF;
}
}
}
int main(){
int m,a,b,w;
cin>>n>>m;
create();
while(m--){
cin>>a>>b>>w;
G[a][b]=G[b][a]=w;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
}
}
}
int dist[MAXN];
int minw=INF,minv=0;
for(int i=1;i<=n;i++){
dist[i]=0;
for(int j=1;j<=n;j++){
dist[i]=max(dist[i],G[i][j]);
}
if(dist[i]<minw){
minw=dist[i];
minv=i;
}
}
if(minv!=0){
cout<<minv<<" "<<minw<<endl;
}
else{
cout<<"0"<<endl;
}
}