【bzoj1875】【JZYZOJ1354】[SDOI2009]HH去散步 矩阵快速幂 点边转换
2024-09-03 02:13:30
http://172.20.6.3/Problem_Show.asp?id=1354
题意:求从起始点到终点走过的路程为x有多少种走法,不保证两点间只有一条路,刚走完一条路时不能原路返回,每条路长度为1。
把每条路更换为正反两条边,再造一条出到起点的边s造一条入为终点的边t,将每一条边作为邻接矩阵中的点,矩乘即可
注意题意告诉我们一条路中的正反两条边不能相连。
代码
#include<cstdio>
#include<cstring>
#include<iostream>
const int maxn=;
const double eps=1e-;
const int modn=;
int n,m,d,s,t;
struct mat{
long long e[][];
mat(){ memset(e,,sizeof(e)); }
};mat a;
struct nod{
int y;
int f;
int rev;
int next;
}e[];
int tot=;
int head[]={};
mat Mul(mat x,mat y){
mat z;
for(int i=;i<=m*+;i++){
for(int j=;j<=m*+;j++){
for(int k=;k<=m*+;k++){
z.e[i][j]+=x.e[i][k]*y.e[k][j];
z.e[i][j]%=modn;
}
}
}
return z;
}
mat Pow(mat x,int k){
mat z;
for(int i=;i<=m*+;i++){
z.e[i][i]=;
}
while(k>){
if(k&){
z=Mul(z,x);
}
x=Mul(x,x);
k/=;
}
return z;
}
void init(int x,int y,int rev){
e[++tot].y=y;
e[tot].next=head[x];
e[tot].rev=rev;
head[x]=tot;
}
void dfs(int x,int v){
int y;
if(x==t){
a.e[v][*m+]=;
}
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(v!=e[i].rev){
a.e[v][i]=;
}
if(!e[i].f){
e[i].f=;
dfs(y,i);
}
}
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&d,&s,&t);
s+=,t+=;
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
init(x+,y+,tot+);
init(y+,x+,tot);
}dfs(s,);
mat z=Pow(a,d+);
printf("%lld\n",z.e[][*m+]);
return ;
}
最新文章
- java基础1.-------抽象类,抽象方法
- QT操作EXCEL
- 与你相遇好幸运,Sail.js创建.sailsrc文件
- spring,maven,dubbo配置
- asp.net预定义的HttpModule
- MAXFLOAT
- [转载] HTTP请求的TCP瓶颈分析
- eclipse注解——作者,创建时间,版本
- Scrum&;Kanban在移动开发团队的实践 (一)
- DevExpress GridControl GridView 导出到 Excel 类
- HashMap工作原理
- 找出数组中特定和数字下标(JAVA)
- Metropolis Hasting算法
- vs错误【C1083 C1854 C4727】的若干解决办法(对预编译文件头的解释)
- iOS 模态视图转场的动画效果
- vue webpack打包
- Luogu P1245 电话号码
- Python PIL 的image类和numpy array之间的互换
- Intellij-插件安装-JRebel热部署插件安装
- java解析复杂json:JSONObject 和 JSONArray的使用