十一届院赛 J题 寻找大黄
来源:互联网 发布:电脑软件开发培训班 编辑:程序博客网 时间:2024/04/28 04:41
最暴力的做法比赛的时候都已经写出来了,但是还是超时了。
下来说要矩阵快速幂优化。
那么推一推就出来了,也是很简单。
#include <bits/stdc++.h>using namespace std;#define ll long long#define INF 0x3f3f3f3fstruct Matrix{ double m[205][205];}M;int n,sum[205];Matrix Mult(Matrix a,Matrix b) //矩阵乘法{ Matrix ans; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { ans.m[i][j]=0.0; for(int k=0;k<n;k++) ans.m[i][j]+=a.m[i][k]*b.m[k][j]; } } return ans;}Matrix quickpow(Matrix a,int b) //矩阵快速幂{ Matrix ans; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i==j) ans.m[i][j]=1.0; else ans.m[i][j]=0.0; } } while(b) { if(b&1) ans=Mult(ans,a); a=Mult(a,a); b/=2; } return ans;}int main(){ int m,k; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(sum,0,sizeof(sum)); for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) M.m[i][j]=0.0; } for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); u--,v--; M.m[v][u]+=1.0; M.m[u][v]+=1.0; sum[u]++; sum[v]++; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(sum[j]!=0.0) M.m[i][j]=M.m[i][j]/(double)sum[j]; } } M=quickpow(M,k); Matrix N; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) N.m[i][j]=0.0; } N.m[0][0]=1.0; M=Mult(M,N); for(int i=0;i<n;i++) printf("%f ",M.m[i][0]); printf("\n"); }return 0;}
0 0
- 十一届院赛 J题 寻找大黄
- 大黄语录
- J题
- 寻找最长合法括号序列九度0J
- 寻找i*j=m的个数(简单模拟)
- 当大黄鸭遇见邦邦熊
- 大黄的1024之路
- 资格赛j题
- NOJ J题 FootBall
- J题 游戏模拟
- 《ACM程序设计》 J题
- 搜索 J题
- J
- j
- j
- J#
- J
- J
- Redis集群
- Jquery真正意义上清空表单内容
- 准确率和召回率小结
- Linux 命令行网络监控工具
- oracle delete了数据表,吓死我了!!
- 十一届院赛 J题 寻找大黄
- Android SQLite数据库—SQLiteOpenHelper(二)
- Android中获取屏幕X,Y轴坐标
- i++ 和 ++i运算
- mysql服务器无法远程连接
- vs配置完VC++目录后,编译前,提示无法打开 .h的源文件
- (RF+RequestLibrary)创建post request实例 Json格式
- log4j保存日志到本地
- mongoexport遭遇Authentication failed