Skip to content

M23555: 节省存储的矩阵乘法

implementation, matrices, http://cs101.openjudge.cn/practice/23555

要求用节省内存的方式实现,不能还原矩阵的方式实现。

思路:利用STL容器思路,对矩阵Y采用行优先的存储方式,实现稀疏矩阵的存储与计算,本题难度可以接受,算上思考时间使用20分钟左右。

cpp
#include <iostream>
#include <vector>
#include <map>
#include <tuple>

using namespace std;

int main() {
    int n, m1, m2;
    cin >> n >> m1 >> m2;

    vector<tuple<int, int, int>> X;
    for (int i = 0; i < m1; ++i) {
        int row, col, val;
        cin >> row >> col >> val;
        X.emplace_back(row, col, val);
    }

    vector<vector<pair<int, int>>> Y_rows(n);
    for (int i = 0; i < m2; ++i) {
        int row, col, val;
        cin >> row >> col >> val;
        Y_rows[row].emplace_back(col, val);
    }
    map<pair<int, int>, int> Z;
    for (const auto& x : X) {
        int i = get<0>(x);    
        int k = get<1>(x);    
        int a = get<2>(x);    
        for (const auto& y : Y_rows[k]) {
            int j = y.first;  
            int b = y.second; 
            Z[{i, j}] += a * b;
        }
    }
    for (const auto& entry : Z) {
        if (entry.second != 0) {
            cout << entry.first.first << " " << entry.first.second << " " << entry.second << endl;
        }
    }
    return 0;
}