11463:Commandos

問題文
http://uva.onlinejudge.org/external/114/11463.html






























ワーシャルフロイドで全点間の最短距離を求めておいて、始点sと始点から最も遠い頂点の距離と、その頂点から終点dまでの距離を求めた。

#include<iostream>
#include<algorithm>
 
#define INF 10000000
 
using namespace std;
 
int V,graph[101][101];
 
void warshall_floyd(void){
  for(int k=0; k<V; k++)
    for(int j=0; j<V; j++)
      for(int i=0; i<V; i++)
    graph[i][j]=min(graph[i][j], graph[i][k]+graph[k][j]);
}
 
int main(void){
 
  int T,m,a,b,s,g;
  cin >> T;
  for(int t=1;t<=T;t++){
    cin >> V >> m;
    fill(graph[0],graph[101],INF);
     
    for(int i=0;i<V;i++)graph[i][i]=0;
     
    for(int i=0;i<m;i++){
      cin >> a >> b;
      graph[a][b]=graph[b][a]=1;
    }
    cin >> s >> g;
    warshall_floyd();
     
    int ans=0;
    for(int i=0;i<V;i++)ans=max(ans,graph[s][i]+graph[i][g]);
    cout << "Case " << t <<": "<<ans<<endl;
  }
  return 0;
}