7-2 三元组顺序表表示的稀疏矩阵加法 (10 分)

三元组顺序表表示的稀疏矩阵加法。

输入格式:

输入第1行为两个同型矩阵的行数m、列数n,矩阵A的非零元素个数t1,矩阵B的非零元素个数t2。 按行优先顺序依次输入矩阵A三元组数据,共t1行,每行3个数,分别表示非零元素的行标、列标和值。 按行优先顺序依次输入矩阵B三元组数据,共t2行,每行3个数,分别表示非零元素的行标、列标和值。

输出格式:

输出第1行为相加后矩阵行数m、列数n及非零元素个数t。 输出t行相加后的三元组顺序表结果,每行输出非零元素的行标、列标和值,每行数据之间用空格分隔。

输入样例1:

4 4 3 4
0 1 -5
1 3 1
2 2 1
0 1 3
1 3 -1
3 0 5
3 3 7

结尾无空行

输出样例1:

4 4 4
0 1 -2
2 2 1
3 0 5
3 3 7

结尾无空行

AC

#include <bits/stdc++.h>

using namespace std;

typedef struct
{
    int i, j, v;
} triple;

typedef struct
{
    triple data[100];
    int m, n, t;
} matrix;

int main()
{
    matrix m1, m2, m0;
    cin >> m1.m >> m1.n >> m1.t >> m2.t;
    m2.m = m1.m;
    m2.n = m1.n;
    for (int a = 0; a < m1.t; a++)
        cin >> m1.data[a].i >> m1.data[a].j >> m1.data[a].v;
    for (int b = 0; b < m2.t; b++)
        cin >> m2.data[b].i >> m2.data[b].j >> m2.data[b].v;
    int index = 0, a = 0, b = 0;
    while (a < m1.t && b < m2.t)
    {
        if (m1.data[a].i < m2.data[b].i)
            m0.data[index++] = m1.data[a++];
        else if (m1.data[a].i > m2.data[b].i)
            m0.data[index++] = m2.data[b++];
        else if (m1.data[a].j < m2.data[b].j)
            m0.data[index++] = m1.data[a++];
        else if (m1.data[a].j > m2.data[b].j)
            m0.data[index++] = m2.data[b++];
        else
        {
            m1.data[a].v += m2.data[b].v;
            if (m1.data[a].v)
                m0.data[index++] = m1.data[a];
            a++;
            b++;
        }
    }
    for (int i = a; i < m1.t; i++)
        m0.data[index++] = m1.data[i];
    for (int i = b; i < m2.t; i++)
        m0.data[index++] = m2.data[i];
    cout << m1.m << ' ' << m1.n << ' ' << index << endl;
    for (int i = 0; i < index; i++)
    {
        if (i)
            cout << endl;
        cout << m0.data[i].i << ' ' << m0.data[i].j << ' ' << m0.data[i].v;
    }
    return 0;
}

回顾

算法不算难,发表这篇文章记录一下自己脑抽的一次经历。在存取第二个矩阵的数据时,我把数据又一次的存入到了m1里面,这就导致我的答案一直不正确,debug过程中也发现一直出错,最后才直到,原来是这出了低级错误,所以uu们写代码的时候一定要细心呀,要不然时间都用来debug上了....

总结

两个结构体:        一个是三元组存储矩阵中的非零项的行、列、值

                              一个是矩阵的非零项顺序表、矩阵的行、列、非零项个数

算法过程:先是读入数据,然后分两头,从头到尾依次读取两个矩阵的非零项顺序表,因为题目讲了“按行优先顺序”,所以行数小的直接进入第三个矩阵,行数一样的话则比较列数,列数小的直接进入第三个矩阵,若行、列数都相等的话,则求两个非零项的和,若和不为零则进入第三个矩阵。每进到第三个矩阵中一个/两个非零项,相应的矩阵非零项顺序表就要往后读取非零项三元组。直到某一个矩阵的非零项三元组顺序表读取完毕后,剩下的另一个矩阵中剩下的非零项三元组依次进入第三个矩阵即可。这样,所得第三个矩阵就是前两个矩阵相加后的结果了。

进入第三个矩阵:在一开始就定义出矩阵三,然后进入第三个矩阵就意味着,将非零项三元组进入到第三个矩阵的非零项三元组顺序表中。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马尼亚硬拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值