// // 关于数据结构的总结与复习 Coding
//关于压缩矩阵转置和连乘
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define maxsize 100
#define error 0
#define ok 1
//#define _OJ_
typedef struct triple
{
int e;
int i; int j;
} triple; //存储行列和值
typedef struct matrix
{
triple data[maxsize];
int col; int row; int cnt;
int pos[100]; //存储非零元素在每一行的第一个元素
}matrix;
matrix
transpose_matrix(matrix M, matrix T)
{ int cnt1, col1;
int q = 0;
T.col = M.col; T.row = M.row; T.cnt = M.cnt;
if(T.cnt != 0) {
for (col1 = 0; col1 < M.col; col1++) { //按照每一列去寻找
for (cnt1 = 0; cnt1 < M.cnt; cnt1++) {
if(M.data[cnt1].j == col1) {
T.data[q].j = M.data[cnt1].i;
T.data[q].i = M.data[cnt1].j;
T.data[q].e = M.data[cnt1].e; q++;
}
}
}
}
return T;
}
// -------------------------------------------------------------------------------
matrix
get_pos(matrix M)
{
int i2, i3, i4;
int num[100];
for (i2 = 1; i2 <= M.row; i2++) num[i2] = 0;
for (i3 = 1; i3 <= M.cnt; i3++) ++num[M.data[i3].i];
//求每一行的非零元素的个数
M.pos[1] = 1;
for (i4 = 2; i4 <= M.row; i4++) M.pos[i4] = M.pos[i4 - 1] + num[i4 - 1];
// printf("pos == %d ", M.pos[i4]);}
return M;
}
matrix
Multi_Matrix(matrix M, matrix T, matrix Q)
{
int num[T.col], i1, i2, p, q, ccol, t_row, num_next, num1_next;
int arow;
Q.row = M.row; Q.col = T.col; Q.cnt = 0;
for (i1 = 1; i1 <= M.row; i1++) { //对每一行进行计算
for (i2 = 1; i2 <= Q.col; i2++) //将计数器置零
num[i2] = 0;
if(i1 < M.row) num_next = M.pos[i1 + 1];
else
num_next = M.cnt + 1; //下一个非零位置
for (p = M.pos[i1]; p < num_next; p++) { //M第p行的所有非零元素
t_row = M.data[p].j;
if(t_row < T.cnt) num1_next = T.pos[t_row + 1];
else
num1_next = T.cnt + 1;
for (q = T.pos[t_row]; q < num1_next; q++) {
ccol = T.data[q].j; //N的第q(M.data[p].j)行所有元素
num[ccol] += M.data[p].e * T.data[q].e;
}
}
for (ccol = 1; ccol <= Q.col; ccol++) {
if(num[ccol] != 0) {
//因为num【】有可能为零所以需重新将其压缩成矩阵
Q.data[++Q.cnt].i = i1; Q.data[Q.cnt].j = ccol;
Q.data[Q.cnt].e = num[ccol];
}
}
}
return Q;
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
int i1, i2, i3, i4;
int num[100];
matrix M, T, Q;
scanf("%d %d %d", &M.row, &M.col, &M.cnt);
// printf("%d %d %d\n", M.row, M.col, M.cnt);
for (i1 = 1; i1 <= M.cnt; i1++) {
scanf("%d %d %d", &M.data[i1].i, &M.data[i1].j, &M.data[i1].e);
// printf("%d %d %d\n", M.data[i1].i, M.data[i1].j, M.data[i1].e);
}
scanf("%d %d %d", &T.row, &T.col, &T.cnt);
// printf("%d %d %d\n", T.row, T.col, T.cnt);
for (i1 = 1; i1 <= T.cnt; i1++) {
scanf("%d %d %d", &T.data[i1].i, &T.data[i1].j, &T.data[i1].e);
// printf("%d %d %d\n", T.data[i1].i, T.data[i1].j, T.data[i1].e);
}
M = get_pos(M); T = get_pos(T);
Q = Multi_Matrix(M, T, Q);
for (i2 = 1; i2 <= Q.cnt; i2++) {
printf("%d %d %d\n", Q.data[i2].i, Q.data[i2].j, Q.data[i2].e);
}
// for (i1 = 0; i1 < M.cnt; i1++) {
// scanf("%d %d %d", &M.data[i1].i, &M.data[i1].j, &M.data[i1].e);
// printf("%d %d %d\n", M.data[i1].i, M.data[i1].j, M.data[i1].e);
// }
// T = transpose_matrix(M,T);
// printf("cnt == %d\n", T.cnt);
// for (i1 = 0; i1 < T.cnt; i1++)
// printf("%d %d %d\n", T.data[i1].i, T.data[i1].j, T.data[i1].e);
return 0;
}
输入:
3 4
4
1 1 3
1 4 5
2 2 -1
3 1 2
4 2
4
1 2 2
2 1 1
3 1 -2
3 2 4
输出:
1 2 6
2 1 -1
3 2 4
[Finished in 0.8s]