三元组顺序表表示的稀疏矩阵加法。
输入格式:
输入第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上了....
总结
两个结构体: 一个是三元组存储矩阵中的非零项的行、列、值
一个是矩阵的非零项顺序表、矩阵的行、列、非零项个数
算法过程:先是读入数据,然后分两头,从头到尾依次读取两个矩阵的非零项顺序表,因为题目讲了“按行优先顺序”,所以行数小的直接进入第三个矩阵,行数一样的话则比较列数,列数小的直接进入第三个矩阵,若行、列数都相等的话,则求两个非零项的和,若和不为零则进入第三个矩阵。每进到第三个矩阵中一个/两个非零项,相应的矩阵非零项顺序表就要往后读取非零项三元组。直到某一个矩阵的非零项三元组顺序表读取完毕后,剩下的另一个矩阵中剩下的非零项三元组依次进入第三个矩阵即可。这样,所得第三个矩阵就是前两个矩阵相加后的结果了。
进入第三个矩阵:在一开始就定义出矩阵三,然后进入第三个矩阵就意味着,将非零项三元组进入到第三个矩阵的非零项三元组顺序表中。