// // 关于数据结构的总结与复习 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]
时间: 2024-10-22 04:13:15