矩阵幂
不是快速幂,只是想写离散作业,随便写的一个幂
#include<iostream> using namespace std; int main() { int a[100][100]; int b[100][100]; int ans[100][100]; int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; b[i][j]=a[i][j]; } } m--; while(m--){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ ans[i][j]=0; for(int k=1;k<=n;k++){ ans[i][j]+=a[i][k]*b[k][j]; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ b[i][j]=ans[i][j]; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<ans[i][j]<<" "; } cout<<endl; } }
最近我又看到了另一种代码,非常简短
#include<cstdio> const int maxn = 257; int n,m; int a[maxn][maxn],aa[maxn][maxn]; int main() { printf("输入点边数n、m\n"); scanf("%d%d",&n,&m); printf("输入边的两点\n"); for(int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); if(x!=y)a[x][y]=a[y][x]=aa[x][y]=aa[y][x]=1; else a[x][y]=aa[x][y]=2; } printf("输入所求次幂\n"); int t; scanf("%d",&t); while(--t) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { int c=0; for(int k=0;k<n;k++) { c+=a[i][k]*aa[k][j]; //printf("%d %d %d\n",i,j,c); } a[i][j]=c; } } } for(int i=0;i<n;i++) for(int j=0;j<n;j++) printf("%d%c",a[i][j],j+1!=n?' ':'\n'); return 0; }
可惜这个代码存在错误。
错误的原因在于,在计算的过程中,对作为被乘数的矩阵进行了更新,导致计算过程结果偏大
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com