稀疏矩阵的压缩存储与快速转置
在m*n的矩阵中,非零元素个数为t,∂=t/(m*n),称∂为矩阵的稀疏因子,当∂<=0.05称矩阵为稀疏矩阵。为了节省空间,可以用三元组来存储稀疏矩阵。三元组记录矩阵非零值的行、列、值。
在求矩阵的转置矩阵时,可以用快速转置方法来节省时间。
#include<bits/stdc++.h> #include<iostream> #include<cctype> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<stack> #include<map> using namespace std; typedef unsigned long long ull; typedef long long ll; typedef pair<ll,ll> pi; #define IOS std::ios::sync_with_stdio(false) #define ls p<<1 #define rs p<<1|1 #define mod 1000000007 #define PI acos(-1.0) #define INF 1e18 #define eps 1e-8 #define N 2000 + 5 /*********************Code*********************/ ll num[N],cpot[N]; struct Node{ ll i,j,e; }; struct node{ Node d[N]; ll m,n,t; }; void solve(node M,node &T){ T.m = M.m; T.n = M.n; T.t = M.t; if(T.t){ for(ll t = 1;t<=M.t;t++) num[M.d[i].j]++; cpot[1] = 1; for(ll col = 2;col<=M.n;i++) cpot[col] = cpot[col-1]+num[col-1]; for(ll p = 1;p <=M.t;p++){ ll col =M.d[p].j; ll q =cpot[col]; T.d[q].i = M.d[p].j; T.d[q].j = M.d[p].i; T.d[q].e = M.d[p].e; cpot[col]++; } } } int main(void){ node M,T; cin>>M.m>>M.n; M.t = 0; for(ll i = 0;;i++){ ll x,y,z; cin>>x>>y>>z; if(!x&&!y&&!z) break; M.d[i].i = x,M.d[i].j = y,M.d[i].e = z; M.t++; } solve(M,T); for(ll i = 0;i<T.t;i++){ cout<<T.d[i].i<<" "<<T.d[i].j<<" "<<T.d[i].e<<endl; } return 0; } /* 10 10 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 0 0 0 */