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;
		}
};