博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1759 Matrix Revolution(矩阵转BFS)
阅读量:4986 次
发布时间:2019-06-12

本文共 1278 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

 对于给定的一个矩阵A,A+A^2+A^3+...+A^K 是多少呢?

其中A^2 表示两个矩阵的乘积A*A,A^3表示三个矩阵的乘积A*A*A,依此类推。

求结果中的非0元素个数。

题解:

乍一看,还以为要矩阵快速幂+矩阵等比求和呢,然后一看范围,卧槽,没法搞啊。

然后我们可以考虑一下这题的特殊性。

只求非0的元素个数。

对于mat[i][j]不为0必须存在一个k使得mat[i][k]*mat[k][j]!=0就行。

所以我们可以对每个点用BFS去求能到达的位置,然后对于k,因为k是大于N的,

i到j最多会经历N-1个点,所以k也不用处理。

分析完后其实就是一个简单的BFS。

1 #include
2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 const int N=10007; 6 int g[N],v[N],nxt[N],ed,n,m,d[N],Q[N]; 7 char k[N]; 8 9 void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}10 11 int sum(int s)12 {13 int l=1,r=0,ret=0;14 F(i,1,n)d[i]=0;15 Q[++r]=s,d[s]=1;16 while(l<=r)17 {18 int x=Q[l++];19 for(int i=g[x];i;i=nxt[i])20 {21 if(d[v[i]])continue;22 d[v[i]]=1,Q[++r]=v[i];23 }24 }25 F(i,1,n)ret+=d[i];26 return ret;27 }28 29 int main()30 {31 while(~scanf("%d%d%s",&n,&m,k))32 {33 memset(g,0,sizeof(g)),ed=0;34 F(i,1,m)35 {36 int x,y,z;37 scanf("%d%d%d",&x,&y,&z);38 adg(x+1,y+1);39 }40 int ans=0;41 F(i,1,n)ans+=sum(i);42 printf("%d\n",ans);43 }44 return 0;45 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/6505465.html

你可能感兴趣的文章
;(function(){ //代码})(); 自执行函数开头为什么要加;或者!
查看>>
201521123096《Java程序设计》第十三周学习总结
查看>>
Asp.Net WebApi 调试利器“单元测试”
查看>>
【luogu P1082 同余方程】 题解
查看>>
数据结构 | 哈希表二次探查法 : 1078
查看>>
纯css实现DIV以及图片水平垂直居中兼容多种浏览器(实现过程)
查看>>
[转载]记不住ASP.NET页面生命周期的苦恼
查看>>
Oracle GoldenGate 二、配置和使用
查看>>
第六次作业
查看>>
Primes on Interval(二分 + 素数打表)
查看>>
百度之星B题(组合数)
查看>>
利用zabbix api添加、删除、禁用主机
查看>>
从头到尾彻底理解KMP
查看>>
字符等价关系
查看>>
Java内存泄露监控工具:JVM监控工具介绍【转】
查看>>
FIREDAC字段类型映射
查看>>
Android 中文字体的设置方法和使用技巧
查看>>
反射的一个小实例
查看>>
windows下搭建nginx+php+laravel开发环境(转)
查看>>
PHP+MySql实现后台数据的读取
查看>>