HDU 5607 graph(DP+矩阵乘法)
【题目链接】
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=663&pid=1002
【题意】
给定一个有向图,若干个询问,问从u走k步到达各个顶点的概率。
其中除法化为乘逆元。
【思路】
设f[i][j]表示到达i点走了j步的概率,则有转移式:
f[i][j]=sigma{ f[pre(i)][j-1]/out[pre(i)] }
其中pre为有向图上的前一个节点,out[u]为u的出度大小。
构造矩阵后使用矩阵乘法加速状态转移。
设e为转移矩阵,若ij相连则e[i][j]<-out[i]^-1,否则为0。
【代码】
#include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int maxn = ;
const int MOD = 1e9+; struct Matrix {
int r,c; ll N[maxn][maxn];
void init(int r,int c) {
this->r=r,this->c=c;
memset(N,,sizeof(N));
}
Matrix operator * (const Matrix& B) const{
Matrix C;
C.init(r,B.c);
FOR(i,,r) FOR(j,,c) FOR(k,,C.c)
C.N[i][j]=(C.N[i][j]+(ll)N[i][k]*B.N[k][j])%MOD;
return C;
}
Matrix pow(int p) {
Matrix tmp=*this,ans;
ans.init(r,r);
FOR(i,,r) ans.N[i][i]=;
while(p) {
if(p&) ans=ans*tmp;
tmp=tmp*tmp;
p>>=;
}
return ans;
}
}f,e,t;
ll pow(ll x,ll p) {
ll tmp=x,ans=;
while(p) {
if(p&) ans=(ans*tmp)%MOD;
tmp=(tmp*tmp)%MOD; p>>=;
}
return ans;
} int n,m,q;
int a[maxn][maxn],out[maxn]; int main()
{
scanf("%d%d",&n,&m);
int u,v,k;
FOR(i,,m) {
scanf("%d%d",&u,&v);
a[u][v]=; out[u]++;
}
e.init(n,n);
FOR(i,,n) {
out[i]=pow(out[i],MOD-);
FOR(j,,n) if(a[i][j]) {
e.N[i][j]=out[i];
}
}
scanf("%d",&q);
while(q--) {
scanf("%d%d",&u,&k);
f.init(,n); f.N[][u]=;
t=e.pow(k);
f=f*t;
FOR(i,,n) printf("%I64d ",f.N[][i]);
puts("");
}
return ;
}
HDU 5607 graph(DP+矩阵乘法)的更多相关文章
- HDU 5607 graph(矩阵乘法)
题意 在一个 \(n\) 个节点 \(m\) 条边的有向图上随机游走,有 \(Q\) 个询问,每次给定一个起点 \(u\) 和步数 \(K\) ,每次回答最后停在每个节点的概率. \(1 \leq n ...
- hdu 5607 graph (矩阵乘法快速幂)
考虑一个经典的问题: 询问从某个点出发,走 k 步到达其它各点的方案数? 这个问题可以转化为矩阵相乘,所以矩阵快速幂即可解决. 本题思路: 矩阵经典问题:求从i点走k步后到达j点的方案数(mod p) ...
- HDU 5607 graph(矩阵优化+概率DP)
该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...
- 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法
题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...
- 【bzoj3329】Xorequ 数位dp+矩阵乘法
题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行每行一个正整数N 输出 2*T行第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 样例 ...
- Hdu 2157 How many ways??(DP||矩阵乘法)
How many ways?? Time Limit:1000 MS Memory Limit: 32768 K Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, ...
- luogu P4719 【模板】动态 DP 矩阵乘法 + LCT
方法二:LCT+矩阵乘法 上文中,我们用线段树来维护重链上的各种矩阵转移. 第二种方法是将树链剖分替换为动态树. 我们知道,矩阵乘法 $\begin{bmatrix} F_{u,0} & F_ ...
- HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)
传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...
- 【BZOJ-4386】Wycieczki DP + 矩阵乘法
4386: [POI2015]Wycieczki Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 197 Solved: 49[Submit][Sta ...
随机推荐
- Python 中的 TK编程
可爱的 Python:Python 中的 TK编程 http://www.ibm.com/developerworks/cn/linux/sdk/python/charm-12/ python che ...
- 1.Spring IoC简单例子
Spring IoC简单例子 1.IHelloMessage.java package com.tony.spring.chapter01; public interface IHelloMessag ...
- C# 对象与JSON串互相转换(转)
DoNet2.0 需要借助于Newtonsoft.Json.dll 代码 using System;using System.IO;using System.Text;using Newtonsoft ...
- asp.net(C#)读取word 文档的方法
第一种方法 Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "Application/msw ...
- django定期执行任务
要在django项目中定期执行任务,比如每天一定的时间点抓取数据,刷新数据库等,可以参考stackoverflow的方法,先编写一个manage.py命令,然后使用crontab来定时执行这个命令. ...
- netty websocket协议开发
websocket的好处我们就不用多说了,就是用于解决长连接.服务推送等需要的一种技术. 以下我们来看一个例子: package com.ming.netty.http.websocket; impo ...
- HDU 4767 Bell(矩阵+中国剩余定理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4767 题意:给出n.求n有多少种划分集合的方式,即bell(n) 思路: #include <i ...
- [Codeforces137C]History(排序,水题)
题目链接:http://codeforces.com/contest/137/problem/C 题意:给n对数,分别是一个事件的起始和终止时间.问被有几个事件被其他事件包含. 思路:先排序,按照起始 ...
- MinGW GCC下sleep()函数问题
在MinGW GCC下编译带sleep()函数的测试程序,不管是包含了unistd.h头文件,还是stdio.h.stdlib.h头文件,就是找不到该函数的定义!在linux下,sleep()函数的头 ...
- Enabling HierarchyViewer on Rooted Android Devices
转自http://blog.apkudo.com/2012/07/26/enabling-hierarchyviewer-on-rooted-android-devices/. The Hierarc ...