hdu2807

/*
分析:
    简单最短路。
    数学是死角,所以暂时不会什么好的方法,暴力水过的,
注意A、B、C三点互异。


2012-12-18
*/








#include"stdio.h"
#include"string.h"
#include"stdlib.h"
int n,m;
int map[90][90];
int E[90][90][90];

void get_floyd()
{
	int k,i,l;
	for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
	for(l=1;l<=n;l++)
		if(map[i][k]+map[k][l]<map[i][l])
			map[i][l]=map[i][k]+map[k][l];
}
void get_map()
{
	int i,l,j;
	int i2,l2,z;
	int t[90][90];

	for(j=1;j<=n;j++)
	for(i=1;i<=m;i++)
	for(l=1;l<=m;l++)
		scanf("%d",&E[j][i][l]);

	for(i=1;i<=n;i++)
	for(l=1;l<=n;l++)
	{
		if(i==l)	map[i][l]=0;
		else		map[i][l]=11111111;
	}

	for(i=1;i<=n;i++)
	{
		for(l=1;l<=n;l++)
		{
			if(i==l)	continue;
			for(i2=1;i2<=m;i2++)
			for(l2=1;l2<=m;l2++)
			{
				t[i2][l2]=0;
				for(z=1;z<=m;z++)	t[i2][l2]+=E[i][i2][z]*E[l][z][l2];
			}
			for(j=1;j<=n;j++)
			{
				if(j==i || j==l)	continue;
				if(map[i][j]==1)	continue;
				int flag=1;
				for(i2=1;i2<=m;i2++)
				{
					for(l2=1;l2<=m;l2++)
					{
						if(t[i2][l2]!=E[j][i2][l2])	{flag=0;break;}
					}
					if(!flag)	break;
				}
				if(flag)	map[i][j]=1;
			}
		}
	}
	get_floyd();
}
int main()
{
	int k,a,b;
	while(scanf("%d%d",&n,&m),n||m)
	{
		get_map();
		scanf("%d",&k);
		while(k--)
		{
			scanf("%d%d",&a,&b);
			if(map[a][b]!=11111111)	printf("%d\n",map[a][b]);
			else					printf("Sorry\n");
		}
	}
	return 0;
}


你可能感兴趣的:(hdu2807)