PAT6-07. 哈利·波特的考试

#include<climits>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
const int INF=INT_MAX,N=102;
int adj[N][N];

int main(){
  fill_n(*adj,N*N,INF);
  for(int i=0;i<N;++i) adj[i][i]=0;
  cin>>n>>m;
  while(m--){
    int a,b,c;cin>>a>>b>>c;
    adj[a][b]=adj[b][a]=c;
  }

  for(int k=1;k<=n;++k)
    for(int i=1;i<=n;++i)
      for(int j=1;j<=n;++j)
	if(adj[i][k]!=INF && adj[k][j]!=INF &&
	   adj[i][k]+adj[k][j]<adj[i][j])
	  adj[j][i] = adj[i][j] = adj[i][k]+adj[k][j];
  
  int mmin=INF,nth,fail=false;
  for(int i=1;i<=n;++i)
    {
      int mmax=INT_MIN;
      for(int j=1;j<=n;++j){
          if(adj[i][j]==INF)fail=true;
          if(adj[i][j]>mmax)mmax=adj[i][j];}
      if(mmax<mmin){mmin=mmax;nth=i;}
    }
  if(fail)cout<<0;
  else cout<<nth<<' '<<mmin;
  return 0;
}
所有节点间的最短路径,一个节点出发的最长路径,再找出所有最长路径中的最短。

注意这是一个无向图,在执行佛洛依德算法时 adj[ i ][ j ] 要与 adj[ i ][ j ] 同样赋值,而有向图时只对 adj[ i ][ j ] 赋值即可


你可能感兴趣的:(PAT6-07. 哈利·波特的考试)