SRM301 div1 medium
ワーシャルフロイドして一番長い2点間最短距離を返せばOK。
#include <vector> using namespace std; int chain[50+10][50+10]; class EscapingJail { public: int n; int getMaxDistance(vector <string> _chain) { n=_chain.size(); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { char c=_chain[i][j]; if('0'<=c && c<='9') chain[i][j]=c-'0'; else if('a'<=c && c<='z') chain[i][j]=c-'a'+10; else if('A'<=c && c<='Z') chain[i][j]=c-'A'+36; else chain[i][j]=(1<<28); } for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) chain[i][j]=min(chain[i][j],chain[i][k]+chain[k][j]); int ans=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans=max(ans,chain[i][j]); return ((1<<28)<=ans)?-1:ans; } };