题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1297

一看感觉是矩阵快速幂之类的,但边权不好处理啊;

普通的矩阵快速幂只能处理边权为1的,所以想办法把边权处理成1;

仔细一看还有一个条件是边权小于10;

所以拆点!把一个点拆成10个点表示到它不同的距离,那么和它相连的那些点就可以跟某个距离的点连边权为1的边;

虽然没有自己想出来,不过1A还是极好的!(因为太简单了)

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,T,w[][],tot,id[][],mod=;
struct Matrix{
int a[][];
Matrix(){memset(a,,sizeof a);}
Matrix operator * (const Matrix &y) const
{
Matrix x;
for(int i=;i<=tot;i++)
for(int k=;k<=tot;k++)
for(int j=;j<=tot;j++)
(x.a[i][j]+=a[i][k]*y.a[k][j])%=mod;
return x;
}
void init(){for(int i=;i<=tot;i++)a[i][i]=;}
}f,ans;
Matrix pw(Matrix x,int k)
{
Matrix ret; ret.init();
for(;k;k>>=,x=x*x)
if(k&)ret=ret*x;
return ret;
}
int main()
{
scanf("%d%d",&n,&T);
char ch[];
for(int i=;i<n;i++)
{
scanf("%s",&ch);
for(int j=;j<n;j++)
w[i][j]=ch[j]-'';
}
for(int i=;i<n;i++)
for(int j=;j<=;j++)
{
id[i][j]=++tot;
if(j)f.a[tot-][tot]++;
}
for(int i=;i<n;i++)
for(int j=;j<n;j++)
if(w[i][j])f.a[id[i][w[i][j]-]][id[j][]]++;
ans.a[][id[][]]=;
Matrix fn=pw(f,T);
ans=ans*fn;
printf("%d",ans.a[][id[n-][]]);
return ;
}

最新文章

  1. adb devices 偵測不到 手機
  2. Mac OS X上搭建伪分布式CDH版本Hadoop开发环境
  3. 1-MSP430点亮一个灯
  4. Android so lib库远程http下载和动态注册
  5. 一看就懂的ReactJs入门教程(精华版)
  6. memcached windowns 安装使用
  7. AngularJS中的MVC模式
  8. ESB概述
  9. Binder机制1---Binder原理介绍
  10. 如何一行jquery代码写出tab标签页(链式操作)
  11. 小米路由器mini如何设置外网访问wan网站的方法
  12. leetcode medium
  13. JS 生成唯一数字
  14. IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)
  15. Confluence 6 降级你的许可证
  16. spring boot2+jpa+thymeleaf增删改查例子
  17. Sed+Grep 快速替换查找字段(批量替换字符串)
  18. django之class Meta
  19. Java 构造 BSON 数据类型
  20. sublime unityshaderplugin

热门文章

  1. Spring Boot 与任务
  2. 王垠代表作《完全用Linux工作》
  3. JAVA基础——IO流字节流
  4. rem js 自适应布局
  5. String类的判断功能
  6. hdu3461
  7. 回文质数 USACO
  8. 【BZOJ3238】差异(后缀数组,单调栈)
  9. N - Is It A Tree? 并查集
  10. ajax多文件上传,js原生ajax请求(转)