7-4 稀疏矩阵加法 (20 分)

关注博主不迷路,博主带你码代码!

7-4 稀疏矩阵加法 (20 分)

给定两个矩阵A和B,求其和矩阵C=A+B。

输入格式:
第一行包含两个数Row和Col,分别表示矩阵的行数和列数,A和B的维度是一致的。
第二行只有一个数N1 ,表示接下来要输入的A中的非零元素的个数。
接下来是N1 行,每一行都是i j A[i,j] 这样的形式,表示的A中第i行第j列的元素A[i,j],为了与大多数编程语言保持一致,它们都是从零开始的,也就是说下标的有效范围是[0,Row−1]×[0,Col−1]。
在N 1行之后,是一个数N2,表示矩阵B中非零元素的数量,此后N2行描述B中的非零元素,它们与此前描述A中非零元素的形式一致。
矩阵元素的输入均遵循行主序。这里的所有的输入均可用int类型正确表示,可以假设输入均是合法的。

输出格式:
第一行输出和矩阵C=A+B中的绝对值大于0.1的元素个数N3,此后是N3行,按照行主序输出其中的非零元素,依次是行、列的下标和对应的元素。

输入样例:

2 2
1
1 1 1
1
0 0 1

输出样例:

2
0 0 1
1 1 1

AC代码

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;

struct Node{
     
	int row, col, val;
	bool flag;
}A[N], B[N], C[N];

int idx;
int n, m; 
int nn, mm;

bool cmp(Node a, Node b){
     
	if(a.row != b.row) return a.row < b.row;
	return a.col < b.col;
}

int main()
{
     
	cin >> n >> m;
	cin >> nn;
	for(int i = 0; i < nn; i ++ ){
     
		cin >> A[i].row >> A[i].col >> A[i].val;
	}
	cin >> mm;
	for(int i = 0; i < mm; i ++ ){
     
		cin >> B[i].row >> B[i].col >> B[i].val;
	}
	for(int i = 0; i < max(nn, mm); i ++ ){
     
		if(A[i].row == B[i].row && A[i].col == B[i].col){
     
			A[i].flag = true;
			B[i].flag = true;
			C[idx].col = A[i].col;
			C[idx].row = A[i].row;
			C[idx].val = A[i].val + B[i].val;
			idx ++ ;
		}
	}
	for(int i = 0; i < max(nn,mm); i ++ ){
     
		if(!A[i].flag){
     
			C[idx].col = A[i].col;
			C[idx].row = A[i].row;
			C[idx].val = A[i].val;
			idx ++ ;
		}
		if(!B[i].flag){
     
			C[idx].col = B[i].col;
			C[idx].row = B[i].row;
			C[idx].val = B[i].val;
			idx ++ ;
		}
	}
	sort(C, C + idx, cmp);
	int count = 0;
	for(int i = 0; i < idx; i ++ ){
     
		if(C[i].val != 0) count ++ ;
	}
	cout << count << endl;
	for(int i = 0; i < idx; i ++ ){
     
		if(C[i].val != 0) cout << C[i].row << " " << C[i].col << " " << C[i].val << endl;
	} 
	return 0;
}



你可能感兴趣的:(PTA,图论,c++,算法)