三元组顺序表表示的稀疏矩阵加法。
输入格式:
输入第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
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int i,j,v;
}triple;
typedef struct{
triple data[10000];
int m,n,t;
}matrix;
int main(){
matrix m1,m0,m2;
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++]=m1.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++]=m1.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<<index<<" "<<m1.m<<" "<<m1.n<<endl;
for(int i=0;i<index;i++){
cout<<m0.data[i].i<<" "<<m0.data[i].j<<" "<<m0.data[i].v<<endl;
}
return 0;
}
-
#include<bits/stdc++.h>
:这是一个预处理指令,用于包含C++标准库的所有头文件。 -
using namespace std;
:这是一个命名空间的声明,允许你直接使用标准库的元素,而不需要在前面加上std::
前缀。 -
typedef struct { int i, j, v; } triple;
:这里定义了一个名为triple
的结构体,包含三整数成员i
、j
和v
,用于表示三元组 (i, j, v)。 -
typedef struct { triple data[10000]; int m, n, t; } matrix;
:定义了一个名为matrix
的结构体,包含一个data
数组,用于存储三元组,以及两个整数成员m
和n
,分别表示矩阵的行数和列数,还有整数成员t
,表示矩阵中非零元素的数量。 -
matrix m1, m0, m2;
:定义了三个matrix
类型的变量m1
、m0
和m2
,分别表示两个输入矩阵和一个输出矩阵。 -
cin >> m1.m >> m1.n >> m1.t >> m2.t;
:从标准输入中读取四个整数,分别为m1
的行数、列数、非零元素数量,以及m2
的非零元素数量。 -
m2.m = m1.m; m2.n = m1.n;
:将m2
的行数和列数设置为与m1
相同。 -
使用循循环读取
m1
和m2
中的三元组数据,分别存储到m1.data
和m2.data
中。 -
int index = 0, a = 0, b = 0;
:定义了三个整数变量,index
用于跟踪输出矩阵m0
中的三元组数量,a
和b
用于跟踪m1
和m2
中的三元组的索引。 -
进入一个
while
循环,循环条件是a
小于m1.t
且b
小于m2.t
,表示遍历m1
和m2
中的三元组。 -
在循环中,首先检查当前
m1
和m2
中的三元组的i
和j
值,以确定如何合并这两个三元组,或者将它们中的一个放入输出矩阵m0
。 -
如果
m1.data[a].i < m2.data[b].i
,则将m1
中的三元组加入到m0
,并递增a
和index
。 -
如果
m1.data[a].i > m2.data[b].i
,则将m2
中的三元组加入到m0
,并递增b
和index
。 -
如果
m1.data[a].i == m2.data[b].i
,则比较它们的j
值,以确定如何合并或添加到m0
。 -
如果
m1.data[a].j < m2.data[b].j
,则将m1
中的三元组加入到m0
,并递增a
和index
。 -
如果
m1.data[a].j > m2.data[b].j
,则将m2
中的三元组加入到m0
,并递增b
和index
。 -
如果
m1.data[a].j == m2.data[b].j
,则表示两个三元组具有相同的i
和j
值,需要将它们的v
值相加,然后判断相加后的值是否非零。如果非零,将结果三元组加入到m0
,并递增a
、b
和index
。 -
最后,处理任何未处理的三元组,将它们加入到
m0
中。 -
输出
m0
的行数、列数和非零元素数量,然后遍历m0.data
数组,输出合并后的三元组信息。
这段代码实现了稀疏矩阵的加法,将两个输入矩阵m1
和m2
相加,结果存储在m0
中,并输出合并后的稀疏矩阵信息。