HDU 2157 How many ways?? (邻接矩阵快速幂)
2024-08-24 17:10:25
题意 : 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值
从这道题才知道邻接矩阵竟然可以乘 , 惊了 ! ! ! 矩阵真的不是白叫的 .
虽然很容易推出是可行的但是还是觉得很神奇 .
WA了几百次 , 后来发现是快速幂的问题 , 我还是不知道为什么 ,
我之前的快速幂因为不想初始化z都直接在第一次乘的时候特殊判断直接把x赋给z , 也没有出现问题 , 但是既然错了...就这样写吧 , 记住就好了 .
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
const double eps=1e-;
const long long modn=;
int n,m;
struct mat{
int e[][];
mat(){
memset(e,,sizeof(e));
}
};
mat pro(mat x,mat y){
mat z;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
z.e[i][j]+=x.e[i][k]*y.e[k][j];
z.e[i][j]%=;
}
}
}return z;
}
mat pow(mat x,int k){
mat z;
for(int i=;i<=n;i++){
z.e[i][i]=;
}
while(k){
if(k%==){
z=pro(z,x);
}
x=pro(x,x);
k/=;
}
return z;
}
int main(){
while(~scanf("%d%d",&n,&m)&&(m||n)){
mat a;
mat c;
int x,y,k;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
a.e[x+][y+]=;
}
scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&k);
c=a;
c=pow(a,k);
int ans=c.e[x+][y+]%;
printf("%d\n",ans);
}
}
return ;
}
最新文章
- AE调用GP工具的方法(转)
- ORA-00907: 缺失右括号
- windows下监测tomcat7内存使用情况
- Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)
- UVa 11375 - Matches
- hadoop2 作业执行过程之yarn调度执行
- 关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了
- Linux Resin 安装
- vmware 新机克隆
- CKeditor使用js验证不得为空
- SpringCloud Alibaba-nacos注册中心
- IP通信基础学习第七周(下)
- Python爬虫-01:爬虫的概念及分类
- Numpy中的广播原则(机制)
- A1074. Reversing Linked List
- decimal, float 和double
- 在SELECT DISTINCT 状况下使用 Order BY Newid() 随机数选出记录
- Spring MVC - 拦截器实现 和 用户登陆例子
- sql注入的防御和挖掘
- 我学MSMQ(一)