zoukankan      html  css  js  c++  java
  • 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("
    ");
            }
            */
            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
    ");
                else printf("%d
    ",map[x][y]);
            }
        }
    }
  • 相关阅读:
    PTA(Advanced Level)1009.Product of Polynomials
    PTA(Advanced Level)1002.A+B for Polynomials
    PTA(Advanced Level)1065.A+B and C
    PTA(Advanced Level)1046.Shortest Distance
    PTA(Advanced Level)1042.Shuffling Machine
    PTA(Basic Level)1046.划拳
    PTA(Basic Level)1060.爱丁顿数
    PTA(Basic Level)1053.住房空置率
    PTA(Basic Level)1023.组个最小数
    DOM4J熟知
  • 原文地址:https://www.cnblogs.com/sweat123/p/4683241.html
Copyright © 2011-2022 走看看