题意:两矩阵A*B=C,那么A到达C的距离为1,给出n个m*m的矩阵,有q个询问,问A到达C矩阵的最短距离
思路:直接相乘,然后floy算法求最短距离
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int M=100005;
int n,m,q;
int mat[82][82][82];
int dis[82][82];
void floyd()
{
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
int t=dis[i][k]+dis[k][j];
if(t<dis[i][j])
dis[i][j]=t;
}
}
void solve()
{
int mt[82][82];
for(int i=1; i<=n; i++) //第一个矩阵
{
for(int ii=1; ii<=n; ii++) //第二个矩阵
{
if(i==ii)continue;
for(int x=1; x<=m; x++)
{
for(int y=1; y<=m; y++)
{
mt[x][y]=0;
for(int z=1; z<=m; z++)
{
mt[x][y]+=mat[i][x][z]*mat[ii][z][y];
}
}
}
//得出结果后和第三个矩阵比较
for(int jj=1; jj<=n; jj++)
{
if(jj==i || jj==ii)continue;
int flag=0;
for(int x=1; x<=m; x++)
{
for(int y=1; y<=m; y++)
{
if(mat[jj][x][y]!=mt[x][y])
{
flag=1;
break;
}
}
if(flag)break;
}
if(!flag)dis[i][jj]=1;
}
}
}
floyd();
}
int main()
{
while(scanf("%d%d",&n,&m),n|m)
{
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
for(int k=1; k<=m; k++)
scanf("%d",&mat[i][j][k]);//输入矩阵
for(int i=1; i<=n; i++)//初始化
for(int j=1; j<=n; j++)
{
if(i==j)dis[i][j]=0;
else
dis[i][j]=11111111;
}
solve();
scanf("%d",&q);
int a,b;
while(q--)
{
scanf("%d%d",&a,&b);
if(dis[a][b]!=11111111)
printf("%d\n",dis[a][b]);
else
printf("Sorry\n");
}
}
return 0;
}