CF446D DZY Loves Games

高斯消元好题

如果暴力地,令f[i][k]表示到i,有k条命的概率,就没法做了。

转化题意

生命取决于经过陷阱的个数

把这个看成一步

所以考虑从一个陷阱到另一个陷阱,不经过其他陷阱的概率p[i][j]

当然1出发到其他陷阱的概率也要得到。

然后相当于有一个新图,

从1出发,走k-1步恰好到n的概率

暴力方法:

枚举一个出发点s,

则$P_x=\sum_{v&&v!=trap}P_v/deg_v+P(x is a start)$

特别地,v是s也可以转移(虽然s可能是陷阱,但是是出发点)

O(n^4)

考虑优化

其实所有的系数都是一样的。只是常数项不一样。即$P(x is a start)$不同。

什么,你说对于某些s是trap,但是作为出发点可以转移这里不同的s条件不同?

我们可以枚举s的出点v,直接把v作为出发点,概率是1/deg(s)

所以,我们可以把常数项扔到等号后面,堆成长度为陷阱数量的向量。

一起带着消即可。

#include<bits/stdc++.h>
#define numb (ch^'0')
#define il inline
#define reg register int
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
x=;char ch;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void prt(T a[],int st,int nd){
for(reg i=st;i<=nd;++i) cout<<a[i]<<" ";cout<<endl;
}
namespace Miracle{
const int N=;
int has[N],con[N][N];
int du[N];
int id[N],mem[N],num;
double f[N][N];
double p[N][N]; int n,m,T;
void guass(int typ,int c){
// cout<<" guass "<<endl;
// for(reg i=1;i<=n;++i){
// for(reg j=1;j<=n+c;++j){
// cout<<f[i][j]<<" ";
// }cout<<endl;
// } for(reg i=;i<=n;++i){
int id=i;
for(reg j=i+;j<=n;++j){
if(fabs(f[j][i])>fabs(f[id][i])) id=j;
}
if(id!=i){
for(reg j=i;j<=n+c;++j){
swap(f[i][j],f[id][j]);
}
}
for(reg j=i+;j<=n;++j){
if(fabs(f[j][i])>){
double lp=f[j][i]/f[i][i];
for(reg k=i;k<=n+c;++k){
f[j][k]-=f[i][k]*lp;
}
}
}
}
if(typ!=){
for(reg i=n;i>=;--i){
for(reg j=i+;j<=n;++j){
if(fabs(f[i][j])>){
for(reg k=n+;k<=n+c;++k){
f[i][k]-=f[i][j]*p[k-n][j];
}
}
}
for(reg k=n+;k<=n+c;++k){
p[k-n][i]=f[i][k]/f[i][i];
}
}
}else{
// for(reg i=1;i<=n;++i){
// for(reg j=1;j<=n+c;++j){
// cout<<f[i][j]<<" ";
// }cout<<endl;
// }
for(reg i=n;i>=;--i){
for(reg j=i+;j<=n;++j){
if(fabs(f[i][j])>){
f[i][n+]-=f[i][j]*p[][j];
}
}
p[][i]=f[i][n+]/f[i][i];
}
}
}
struct tr{
double a[][];
tr(){memset(a,,sizeof a);}
void init(){
for(reg k=;k<=num;++k){
a[k][k]=1.00;
}
}
tr friend operator *(const tr &a,const tr &b){
tr c;
for(reg k=;k<=num;++k){
for(reg i=;i<=num;++i){
for(reg j=;j<=num;++j){
c.a[i][j]+=a.a[i][k]*b.a[k][j];
}
}
}
return c;
}
}S,B;
tr qm(tr B,int y){
tr ret;ret.init();
while(y){
if(y&) ret=ret*B;
B=B*B;
y>>=;
}
return ret;
} int main(){
rd(n);rd(m);rd(T);
for(reg i=;i<=n;++i){
rd(has[i]);
if(has[i]) mem[++num]=i,id[i]=num;
}
int x,y;
for(reg i=;i<=m;++i){
rd(x);rd(y);
++du[x];++du[y];
++con[x][y];++con[y][x];
}
for(reg i=;i<=n;++i){
f[i][i]=1.000;
for(reg j=;j<=n;++j){
if(j==i) continue;
if(!has[j]&&con[i][j]){
f[i][j]=-(double)con[i][j]/du[j];
}
}
if(i==) f[i][n+]=1.00;
}
guass(,); // for(reg i=1;i<=num;++i){
// cout<<" memi "<<i<<" : "<<mem[i]<<" "<<p[0][mem[i]]<<endl;
// } memset(f,,sizeof f); for(reg i=;i<=n;++i){
f[i][i]=1.000;
for(reg j=;j<=n;++j){
if(j==i) continue;
if(!has[j]&&con[i][j]){
f[i][j]=-(double)con[i][j]/du[j];
}
}
for(reg j=;j<=num;++j){
if(mem[j]==i) continue;
if(con[mem[j]][i]){
f[i][j+n]=(double)con[mem[j]][i]/du[mem[j]];
}
}
}
guass(,num);
for(reg j=;j<=num;++j){
B.a[][j]=p[][mem[j]];
}
for(reg i=;i<=num;++i){
for(reg j=;j<=num;++j){
B.a[i][j]=p[i][mem[j]];
}
}
// B.a[num][num]=1.00; // for(reg i=0;i<=num;++i){
// for(reg j=0;j<=num;++j){
// cout<<B.a[i][j]<<" ";
// }cout<<endl;
// } S.a[][]=1.00;
S=S*qm(B,T-); printf("%.10lf",S.a[][num]);
return ;
} }
signed main(){
Miracle::main();
return ;
}

只关心生命值多少

题意转化!变成新图!

系数相同,带着常数一起消除!

CF446D DZY Loves Games的更多相关文章

  1. 【CF446D】DZY Loves Games 高斯消元+矩阵乘法

    [CF446D]DZY Loves Games 题意:一张n个点m条边的无向图,其中某些点是黑点,1号点一定不是黑点,n号点一定是黑点.问从1开始走,每次随机选择一个相邻的点走过去,经过恰好k个黑点到 ...

  2. 【CF446D】DZY Loves Games

    题解: 不错的题目 首先要求的黑点个数非常多 比较容易想到矩阵乘法 于是我们可以求出从某个黑点出发到任意一个黑点之间的概率 发现不同出发点带来的变化只有常数项 于是我们可以预处理出从每个方程转移的系数 ...

  3. Codeforces 446D - DZY Loves Games(高斯消元+期望 DP+矩阵快速幂)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题,%%% 首先考虑所有格子都是陷阱格的情况,那显然就是一个矩阵快速幂,具体来说,设 \(f_{i,j}\) 表示走了 \(i\) 步 ...

  4. D. DZY Loves Modification

    D. DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  5. Codeforces Round #FF (Div. 2) D. DZY Loves Modification 优先队列

    D. DZY Loves Modification time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  6. [CodeForces - 447D] D - DZY Loves Modification

    D - DZY Loves Modification As we know, DZY loves playing games. One day DZY decided to play with a n ...

  7. Codeforces Round #FF (Div. 1) B. DZY Loves Modification 优先队列

    B. DZY Loves Modification 题目连接: http://www.codeforces.com/contest/446/problem/B Description As we kn ...

  8. Codeforces Round #FF (Div. 1) B. DZY Loves Modification

    枚举行取了多少次,如行取了i次,列就取了k-i次,假设行列单独贪心考虑然后相加,那么有i*(k-i)个交点是多出来的:dpr[i]+dpc[k-i]-i*(k-i)*p 枚举i取最大值.... B. ...

  9. CF446B DZY Loves Modification 优先队列

    As we know, DZY loves playing games. One day DZY decided to play with a n × m matrix. To be more pre ...

随机推荐

  1. POJ - 1655 (点分治-树的重心)

    题目:https://vjudge.net/contest/307753#problem/D 题意:给你一棵树,让你求出一个点,让他的最大子树的节点数尽量小 思路:最大子树节点数尽量小,一看就是树的重 ...

  2. DIV置底层或置最高层的方法下拉菜单被挡住

    网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等. 但经常会发现.幻灯片会挡住下拉菜单或者飘浮广告微信开店等. 解决办法有下 第一,可将幻灯片所在DIV 置于最底层.添加CSS如下 style=& ...

  3. 获取header中content-type的值

    后台传过来的值需要根据content-Type的值来判定成功与否 获取header中content-Tyep的值 用res.header['Content-Type']  

  4. linux下的命令是如何运行的

    linux下的命令分为内建命令.可执行文件.脚本文件 shell终端里键入一个命令,如ls.cd.bash,shell会先查询一个环境变量PATH,它存了各种可执行文件的路径,输入$PATH可以打印变 ...

  5. 关于日历实现代码里lunarInfo(农历)数组

    var lunarInfo=new Array( 0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x0 ...

  6. webservice 学习笔记 1

    Webservice----------->跨语言服务调用 (视频学习总结) 1-1.有OA系统 需要添加一个功能,登录之后显示天气情况 此时可以使用Webservice eg1: 气象局自己有 ...

  7. Ubuntu安装程序提示无法获得锁

    目录 1.问题描述 2.问题原因 3.解决方案 3.1方法一:杀掉apt-get进程 3.2方法二:强制解锁 1.问题描述 E: 无法获得锁 /var/lib/dpkg/lock-frontend - ...

  8. Dubbo 系列(07-3)集群容错 - 负载均衡

    目录 Dubbo 系列(07-3)集群容错 - 负载均衡 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 1.1 负载均衡算法 1.2 继承体系 2. 源码分析 ...

  9. python面试题之迭代器和生成器的区别

    1 迭代器是一个更抽象的概念,任何对象,如果它的类有next方法和iter方法返回自己本身.对于string.list.dict.tuple等这类容器对象,使用for循环遍历是很方便的.在后台for语 ...

  10. 第四节 RabbitMQ在C#端的应用-客户端连接

    原文:第四节 RabbitMQ在C#端的应用-客户端连接 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/87 ...