此题中的A,B,C必须互异,wrong了好久
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#define INF 99999999
#define LL long long
#define maxn 100
using namespace std;
int n,m,k;
int dis[maxn][maxn];
typedef struct
{
int z[maxn][maxn];
}matrix;
matrix jz[maxn];
matrix addmatrix(matrix a,matrix b)//矩阵相乘
{
matrix s;
memset(s.z,0,sizeof(s.z));
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
for(int u=0;u<m;u++)
{
s.z[i][j]+=a.z[i][u]*b.z[u][j];
}
}
}
return s;
}
bool jdgmatrix(matrix a,matrix b)//判断两个矩阵是否相等
{
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(a.z[i][j]!=b.z[i][j])
return false;
}
}
return true;
}
void initdistance()//初始化距离数组
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
dis[i][j]=INF;//全为无穷大,此题中当i==j时,距离也初始化为INF
}
}
}
void writedistance(matrix *a)//写入距离数组,更新数据
{
matrix tem;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)//!!!不同
continue;
tem=addmatrix(a[i],a[j]);
for(int u=0;u<n;u++)
{
if(u==i||u==j)//!!!不同
continue;
if(jdgmatrix(tem,a[u]))
dis[i][u]=1;
}
}
}
/*for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
cout << dis[i][j] << ' ';
}
cout << endl;*/
}
int main()
{
while(scanf("%d %d",&n,&m)&&n&&m)
{
for(int i=0;i<n;i++)
{
for(int u=0;u<m;u++)
{
for(int v=0;v<m;v++)
{
int t;
scanf("%d",&t);
jz[i].z[u][v]=t;
}
}
}
scanf("%d",&k);
int x,y;
initdistance();
writedistance(jz);
for(int i=0;i<k;i++)
{
scanf("%d %d",&x,&y);
x--;y--;
for(int t1=0;t1<n;t1++)//弗洛伊德
{
for(int o=0;o<n;o++)
{
for(int p=0;p<n;p++)
{
if(dis[o][p]>dis[o][t1]+dis[t1][p])
dis[o][p]=dis[o][t1]+dis[t1][p];
}
}
}
if(dis[x][y]==INF)
printf("Sorry\n");
else
printf("%d\n",dis[x][y]);
}
}
return 0;
}