哈利·波特的考试

/*
魔咒的长度就相当于图中边的权值,而且告诉我们是无向图,因为正反都可以变且魔咒长度相同。
相当于求解相对于每个节点来说能到达的最远距离的最小值是多少。
是一个多源最短路问题,应用弗罗伊德算法解决。
*/ 
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000010
int N,M;
int a[101][101];
//考察最短路--从所有路径中选择出 【最长路径】最小的那条路径 
//采用floyd算法
void Floyd(){
    for(int k=1;k<=N;k++){
        for (int i = 1; i <= N; i++) {
              for (int j = 1; j <= N; j++) {
                  if (a[i][j] > a[i][k] + a[k][j]) {
                      a[i][j] = a[i][k] + a[k][j];
                  }
              }
          }
    }
}
int main(){
    cin>>N>>M;
    //初始化距离数组a 
    for(int i=0;i<=N;i++){
        for(int j=0;j<=N;j++) {
           if(i==j) a[i][j]=0;
           else a[i][j]=inf;      
        }
    }
    int c,b,dis;
    for(int k=0;k<M;k++){
        cin>>c>>b>>dis;
        a[b][c]=a[c][b]=dis;
    } 
    
    Floyd();
    //p:为这些点中到各个点的最短-最长路径的起始点 
    //mint:p作为起始点到各个点距离中的最长距离
    int p=0,mint=inf,maxt=0; 
    for(int i=1;i<=N;i++){
        maxt=0;//i作为起始点到各个点距离中的最长距离 
        for(int j=1;j<=N;j++){
            if(maxt<=a[i][j]) maxt=a[i][j];
        }
        if(mint>maxt){
            mint=maxt;
            p=i;
        }
    }
    if(p==0) cout<<"0"<<endl;
    else cout<<p<<" "<<mint;
    return 0;
} 

 

posted @ 2020-03-09 21:37  saaas  阅读(225)  评论(0)    收藏  举报