提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 7.1 稀疏矩阵之差
- 7.2 二叉树最短路径长度
- 7.3 文字编辑
- 7.4 方案计数
7.1 稀疏矩阵之差
7-1 稀疏矩阵之差
分数 100
作者 谷方明
单位 吉林大学
矩阵A和B都是稀疏矩阵。请计算矩阵的差A-B.如果A、B不能计算差值,输出"Illegal!"
输入格式:
矩阵的输入采用三元组表示,先A后B。对每个矩阵:
第1行,3个整数N、M、t,用空格分隔,分别表示矩阵的行数、列数和非0数据项数,10≤N、M≤50000,t≤min(N,M).
第2至t+1行,每行3个整数r、c、v,用空格分隔,表示矩阵r行c列的位置是非0数据项v, v在32位有符号整型范围内。三元组默认按行列排序。
输出格式:
矩阵A-B,采用三元组表示,默认按行列排序,非零项也在32位有符号整型范围内。
输入样例:
在这里给出一组输入。例如:
10 10 3
2 2 2
5 5 5
10 10 20
10 10 2
2 2 1
6 6 6
输出样例:
在这里给出相应的输出。例如:
10 10 4
2 2 1
5 5 5
6 6 -6
10 10 20
代码长度限制
16 KB
时间限制
100 ms
内存限制
10 MB
思路:
1.将稀疏矩阵按行列顺序存储
先存入然后使用sort排序保证行列序
2.将两个稀疏矩阵相减
因为行列小的要先存入,我这里认为如果一个矩阵已经合并结束,也不退出循环,而是将它代表结点的值赋值0,行列复制为无穷
在计算时若出现相减等于0的val值应避免录入
余下思路在注释体现
参考代码:
#include <iostream>
#include <vector>
#include <algorithm>
typedef struct {
int row;//行
int col;//列
int val;
}Matrix;
bool com(Matrix a, Matrix b) {
if (a.row != b.row) { return a.row < b.row; }
else if (a.col != b.col) { return a.col < b.col; }
}
using namespace std;
vector<Matrix> ans;
int min(int m, int n) {
if (m > n) {
return n;
}
else {
return m;
}
}
bool Isalessb(Matrix A, Matrix B) {//a是否小于b?
if (A.row != B.row) { return A.row < B.row; }
if (A.col != B.col) { return A.col < B.col; }
return false;
}
bool Isaequalb(Matrix A, Matrix B) {//a是否等于b?
if (A.row == B.row && A.col == B.col) {
return true;
}
return false;
}
Matrix* newjuzhen(int M, int N, int t) {
int row = 0, col = 0, val = 0;
int countA = 0;
Matrix* A = new Matrix[min(M, N)];
f