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]);
        }
    }
}

 

posted @ 2015-07-28 16:18  sweat123  阅读(211)  评论(0编辑  收藏  举报