#include <iostream> #include <vector> using namespace std; typedef vector<vector<int>> MATRIX; typedef vector<int> MATRIX_CHILD; typedef vector<vector<bool>> ACCESS_MATRIX; typedef vector<bool> ACCESS_MATRIX_CHILD; MATRIX matrix_power(MATRIX,unsigned int); MATRIX matrix_mul(MATRIX,MATRIX); ACCESS_MATRIX matrix_access(MATRIX,unsigned int); ACCESS_MATRIX matrix_access(ACCESS_MATRIX,unsigned int); ACCESS_MATRIX matrix_access_mul(ACCESS_MATRIX,ACCESS_MATRIX); int main(){ MATRIX arr{{1,2},{3,4}}; auto y=matrix_power(arr,3); for(auto x:y){ for(auto z:x) cout<<z<<' '; cout<<endl; } MATRIX a={{1,2},{3,4},{5,6}}; MATRIX b={{1,2,3},{4,5,6}}; auto c=matrix_mul(b,a); for(auto x:c){ for(auto z:x) cout<<z<<' '; cout<<endl; } MATRIX d={{1,2,1,0,0},{2,1,0,0,0},{1,0,1,0,0},{0,0,0,1,1},{0,0,0,1,1}}; auto e=matrix_access(d,5); for(int i=0;i<e.size();i++){ for(int j=0;j<e.size();j++) cout<<e[i][j]<<' '; cout<<endl; } return 0; } //矩阵相乘,前提:a.size()=b[0].size() MATRIX matrix_mul(MATRIX a,MATRIX b){ MATRIX_CHILD tmp(a.size(),0); MATRIX res(a.size(),tmp); for(int i=0;i<a.size();i++) for(int j=0;j<a.size();j++) for(int k=0;k<b.size();k++) res[i][j]+=a[i][k]*b[k][j]; return res; } //矩阵幂 MATRIX matrix_power(MATRIX src,unsigned int power){ MATRIX_CHILD child(src.size(),0); MATRIX res(src.size(),child); for(int i=0;i<src.size();i++) res[i][i]=1; while(power--) res=matrix_mul(res,src); return res; } //计算可达性矩阵 ACCESS_MATRIX matrix_access(MATRIX src,unsigned int step){ ACCESS_MATRIX_CHILD child(src.size(),false); ACCESS_MATRIX res(src.size(),child); for(int i=0;i<src.size();i++) for(int j=0;j<src.size();j++) res[i][j]=src[i][j]; return matrix_access(res,step); } //重载计算可达性矩阵 ACCESS_MATRIX matrix_access(ACCESS_MATRIX src,unsigned int step){ ACCESS_MATRIX_CHILD child(src.size(),false); ACCESS_MATRIX res(src.size(),child); for(int i=0;i<src.size();i++) res[i][i]=true; while(step--) res=matrix_access_mul(res,src); return res; } //布尔矩阵相乘 ACCESS_MATRIX matrix_access_mul(ACCESS_MATRIX a,ACCESS_MATRIX b){ ACCESS_MATRIX_CHILD child(a.size(),false); ACCESS_MATRIX res(a.size(),child); for(int i=0;i<a.size();i++) for(int j=0;j<a.size();j++) for(int k=0;k<b.size();k++) res[i][j]=res[i][j]||a[i][k]&&b[k][j]; return res; }
C++算法之矩阵的部分操作
最新推荐文章于 2024-03-23 09:44:33 发布