hdu2807 矩阵乘法+floyd
网上有优化的方法 就是乘上一个一维的矩阵;现在还没有想通。想通了不上代码;
我用的就是普通的矩阵,压着时间过;只是多了一个判断条件,不加这个条件就超时;
#include<stdio.h> #include<string.h> #define INF 99999999 #define maxn 85 struct Mat { int mat[maxn][maxn]; }a[85]; int n,m,map[maxn][maxn]; Mat operator * (Mat a,Mat b) { Mat c; int i,j,k; memset(c.mat,0,sizeof(c.mat)); for(i=0;i<m;i++) for(j=0;j<m;j++) for(k=0;k<m;k++) { c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; } return c; } int ok(Mat aa,Mat bb) { int i,j; for(i=0;i<m;i++) for(j=0;j<m;j++) { if(aa.mat[i][j]!=bb.mat[i][j]) return 0; } return 1; } void init() { int i,j; for(i=0;i<=n;i++) for(j=0;j<=n;j++) if(i==j)map[i][j]=0; else map[i][j]=INF; } void floyd() { int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) if(map[j][k]>map[j][i]+map[i][k]) map[j][k]=map[j][i]+map[i][k]; } int main() { int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { if(!n&&!m)break; init(); for(i=0;i<n;i++) { for(j=0;j<m;j++) for(k=0;k<m;k++) scanf("%d",&a[i].mat[j][k]); } for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j)continue; Mat c=a[i]*a[j]; for(k=0;k<n;k++) { if(map[i][k]==1)continue;//加上就不超时 if(i==k||j==k)continue; if(ok(c,a[k])) map[i][k]=1; } } } /* for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%d ",map[i][j]); printf("\n"); } */ floyd(); int k; scanf("%d",&k); for(i=0;i<k;i++) { int x ,y; scanf("%d %d",&x,&y); x--;y--; if(map[x][y] >= INF) printf("Sorry\n"); else printf("%d\n",map[x][y]); } } }