题意:如果A*B=C 那么A与C之间的距离为1 其中ABC为矩阵 下面q次询问 求2个矩阵之间的最短路
思路:暴力 n的5次的复杂度 枚举2个矩阵 然后算出2个矩阵的乘积 再去找第三个矩阵 建图 然后floyd 1500ms左右 其中写成了函数调用也超时了
还有一种将二维矩阵利用向量转换成一维标识矩阵的优化 这里先记一下 有空再学
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 88;
int a[maxn][maxn][maxn];
int d[maxn][maxn];
int s[maxn][maxn];
int n, m;
void floyd()
{
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(d[i][j] > d[i][k] + d[k][j])
d[i][j] = d[i][k] + d[k][j];
}
void ok(int x, int y)
{
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= m; j++)
{
s[i][j] = 0;
for(int k = 1; k <= m; k++)
{
s[i][j] += a[x][i][k] * a[y][k][j];
}
}
}
for(int i = 1; i <= n; i++)
{
if(i == x || i == y)
continue;
int k, j;
for(j = 1; j <= m; j++)
{
for(k = 1; k <= m; k++)
{
if(a[i][j][k] != s[j][k])
break;
}
if(k <= m)
break;
}
if(j == m+1)
d[x][i] = 1;
}
}
int main()
{
while(scanf("%d %d", &n, &m) && (n||m))
{
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
{
if(i == j)
d[i][j] = 0;
else
d[i][j] = 99999999;
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
for(int k = 1; k <= m; k++)
scanf("%d", &a[i][j][k]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
if(i == j)
continue;
for(int ii = 1; ii <= m; ii++)
{
for(int jj = 1; jj <= m; jj++)
{
s[ii][jj] = 0;
for(int kk = 1; kk <= m; kk++)
{
s[ii][jj] += a[i][ii][kk] * a[j][kk][jj];
}
}
}
for(int ii = 1; ii <= n; ii++)
{
if(ii == i || ii == j)
continue;
int jj, kk;
for(jj = 1; jj <= m; jj++)
{
for(kk = 1; kk <= m; kk++)
{
if(a[ii][jj][kk] != s[jj][kk])
break;
}
if(kk <= m)
break;
}
if(jj == m+1)
d[i][ii] = 1;
}
}
floyd();
int p;
scanf("%d", &p);
while(p--)
{
int u, v;
scanf("%d %d", &u, &v);
if(d[u][v] == 99999999)
puts("Sorry");
else
printf("%d\n", d[u][v]);
}
}
return 0;
}