7. 稀疏矩阵的乘法运算

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。
本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

输入:
第1个:
稀疏矩阵的行数
列数
非零元个数(三个数都大于0)
三元组
第2个:
稀疏矩阵的行数
列数
非零元个数(三个数都大于0)
三元组
以行为主序输入稀疏矩阵三元组表
输出:
乘积矩阵的行数
列数
非零元个数(三个数都大于0)
三元组

测试用例:
输入:
3
4
4
1 1 3
1 4 5
2 2 -1
3 1 2
4
2
4
1 2 2
2 1 1
3 1 -2
输出:
3
2
3
1,2,6
2,1,-1
3,2,4

代码

#include
#include
using namespace std;

struct Matrix
{
    int Rows, Cols, Nums;
    struct
    {
        int row, col, vol;
    }lists[100];
};

void MatrixMul(Matrix&A_Matrix, Matrix&B_Matrix, Matrix&C_Matrix)
{
    C_Matrix.Cols = B_Matrix.Cols; C_Matrix.Rows = A_Matrix.Rows;
    int nnt = 1, NewRow = 0, expt[10000] = { 0 };
    for (int i = 1; i <= A_Matrix.Nums; i++)
    {
        if (NewRow != A_Matrix.lists[i].row)
        {
            for (int j = 1; j <= B_Matrix.Cols; j++)
            {
                if (expt[j] != 0)
                {
                    C_Matrix.lists[nnt].col = j;
                    C_Matrix.lists[nnt].vol = expt[j];
                    C_Matrix.lists[nnt].row = NewRow;
                    nnt++;
                }
            }
            memset(expt, 0, sizeof(expt));
            NewRow = A_Matrix.lists[i].row;
        }
        for (int j = 1; j <= B_Matrix.Nums; j++)
            if (A_Matrix.lists[i].col == B_Matrix.lists[j].row)
                expt[B_Matrix.lists[j].col] += A_Matrix.lists[i].vol*B_Matrix.lists[j].vol;
    }
    for (int i = 1; i <= B_Matrix.Cols; i++)
    {
        if (expt[i] != 0)
        {
            C_Matrix.lists[nnt].col = i;
            C_Matrix.lists[nnt].vol = expt[i];
            C_Matrix.lists[nnt].row = NewRow;
            nnt++;
        }
    }
    C_Matrix.Nums = nnt - 1;
}

int main()
{
    Matrix A_Matrix, B_Matrix, C_Matrix;
    scanf("%d", &A_Matrix.Rows);
    scanf("%d", &A_Matrix.Cols);
    scanf("%d", &A_Matrix.Nums);
    for (int i = 1; i <= A_Matrix.Nums; i++)
        scanf("%d %d %d", &A_Matrix.lists[i].row, &A_Matrix.lists[i].col, &A_Matrix.lists[i].vol);
    scanf("%d", &B_Matrix.Rows);
    scanf("%d", &B_Matrix.Cols);
    scanf("%d", &B_Matrix.Nums);
    for (int i = 1; i <= B_Matrix.Nums; i++)
        scanf("%d %d %d", &B_Matrix.lists[i].row, &B_Matrix.lists[i].col, &B_Matrix.lists[i].vol);
    MatrixMul(A_Matrix, B_Matrix, C_Matrix);
    printf("%d\n%d\n%d\n", C_Matrix.Rows, C_Matrix.Cols, C_Matrix.Nums);
    for (int i = 1; i <= C_Matrix.Nums; i++)
        printf("%d,%d,%d\n", C_Matrix.lists[i].row, C_Matrix.lists[i].col, C_Matrix.lists[i].vol);

    return 0;
}

你可能感兴趣的:(BITSS2017DS)