BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率。 所以总共有n^2种状态。

p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该点的概率.

那么对于每一种状态a,b 则有P(a,b)=p[a]∗p[b]∗P(a,b)+Out[u]∗p[b]∗P(u,b)+p[a]∗Out[v]∗P(a,v)+Out[u]∗Out[v]∗P(u,v) 则有n^2个方程

对于起始状态a,b,则有P(a,b)=p[a]∗p[b]∗P(a,b)+Out[u]∗p[b]∗P(u,b)+p[a]∗Out[v]∗P(a,v)+Out[u]∗Out[v]∗P(u,v)+1

 #include <cstdio>
#include <cstring>
const int Maxn=;
double p[Maxn],Out[Maxn],a[][];
int Degree[Maxn],n,m,head[Maxn],cnt,s,t,u,v;
struct Edge{int to,next;}edge[Maxn<<];
inline void Add(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
inline int Id(int x,int y) {return (x-)*n+y;}
inline void Swap(double &x,double &y) {double t=x;x=y;y=t;}
void Build(int x,int y)
{
int S=Id(x,y);
a[S][S]-=;
for (int i=head[x];i!=-;i=edge[i].next)
for (int j=head[y];j!=-;j=edge[j].next)
{
int u=edge[i].to,v=edge[j].to,T=Id(u,v);
if (u!=v)
{
if (u==x && v==y) a[S][T]+=p[u]*p[v];
else if (u==x) a[S][T]+=p[u]*Out[v];
else if (v==y) a[S][T]+=Out[u]*p[v];
else a[S][T]+=Out[u]*Out[v];
}
}
}
inline void Guass(int n)
{
for (int i=;i<=n;i++)
{
for (int j=i;j<=n;j++)
if (a[j][i])
{
for (int k=;k<=n+;k++) Swap(a[i][k],a[j][k]);
for (int k=;k<=n+;k++) if (k!=i) a[i][k]/=a[i][i];
a[i][i]=;
break;
}
if (!a[i][i]) continue;
for (int j=;j<=n;j++)
{
if (j==i) continue;
double t=a[j][i];
for (int k=;k<=n+;k++) a[j][k]-=t*a[i][k];
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
memset(head,-,sizeof(head));
for (int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
Add(u,v),Add(v,u);
Degree[u]++,Degree[v]++;
}
for (int i=;i<=n;i++) scanf("%lf",&p[i]);
for (int i=;i<=n;i++) Out[i]=(-p[i])/Degree[i];
for (int i=;i<=n;i++) Add(i,i);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) Build(i,j);
a[Id(s,t)][n*n+]=-;
Guass(n*n);
for (int i=;i<=n;i++) printf("%.6lf ",a[Id(i,i)][n*n+]);
return ;
}

C++

BZOJ 1778:和上面的题目差不多但是要注意的是自己不可能转移到自己因为要么炸要么移动

P(u)=Out(v)*P(v) 特别的 P(1)=Out(v)*P(v)+P/Q然后高斯消元即可.

 #include <cstdio>
#include <cmath>
#include <cstring>
#define LD long double
const int Maxn=;
const int Maxm=;
const LD eps=1e-;
int Degree[Maxn],head[Maxn],n,m,P,Q,cnt,u,v;
LD a[Maxn][Maxn],t,Out[Maxn];
struct Edge{int to,next;}edge[Maxm<<];
inline void Swap(LD &x,LD &y) {LD t=x;x=y;y=t;}
inline int dcmp(LD x) {if (fabs(x)<eps) return ; return (x>)?:-;}
inline void Add(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
inline void Build(int u)
{
a[u][u]=1.0;
for (int i=head[u];i!=-;i=edge[i].next)
a[u][edge[i].to]=-Out[edge[i].to];
}
inline void Gauss()
{
for (int i=;i<=n;i++)
{
for (int j=i;j<=n;j++)
if (dcmp(a[i][j])!=)
{
for (int k=;k<=n+;k++) Swap(a[i][k],a[j][k]);
for (int k=;k<=n+;k++) if (k!=i) a[i][k]/=a[i][i];
a[i][i]=;
break;
}
if (dcmp(a[i][i])==) continue;
for (int j=;j<=n;j++)
{
if (j==i) continue;
LD t=a[j][i];
for (int k=;k<=n+;k++) a[j][k]-=t*a[i][k];
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&P,&Q); t=(LD)P/(LD)Q; t=1.0-t;
memset(head,-,sizeof(head)); cnt=;
for (int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
Add(u,v),Add(v,u),Degree[u]++,Degree[v]++;
} for (int i=;i<=n;i++) Out[i]=t/(LD)Degree[i];
for (int i=;i<=n;i++) Build(i);
a[][n+]=-t;
Gauss();
for (int i=;i<=n;i++) printf("%.9Lf\n",a[i][n+]);
return ;
}

C++

BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)的更多相关文章

  1. BZOJ 3150 [Ctsc2013]猴子 ——期望DP 高斯消元

    一堆牌的期望等于每张牌的期望值和. 考虑三个人的游戏即可得到. 然后每张牌遇到另外一张的概率相同,然后就可以列方程求解了. #include <cmath> #include <cs ...

  2. BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元

    BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元 题意: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机 ...

  3. BZOJ 4820 [Sdoi2017]硬币游戏 ——期望DP 高斯消元

    做法太神了,理解不了. 自己想到的是建出AC自动机然后建出矩阵然后求逆计算,感觉可以过$40%$ 用一个状态$N$表示任意一个位置没有匹配成功的概率和. 每种匹配不成功的情况都是等价的. 然后我们强制 ...

  4. HDU 2262 Where is the canteen 期望dp+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2262 Where is the canteen Time Limit: 10000/5000 MS ...

  5. hdu4418 Time travel 【期望dp + 高斯消元】

    题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...

  6. 【noi2019集训题1】 脑部进食 期望dp+高斯消元

    题目大意:有n个点,m条有向边,每条边上有一个小写字母. 有一个人从1号点开始在这个图上随机游走,游走过程中他会按顺序记录下走过的边上的字符. 如果在某个时刻,他记录下的字符串中,存在一个子序列和S2 ...

  7. LightOJ 1151 Snakes and Ladders 期望dp+高斯消元

    题目传送门 题目大意:10*10的地图,不过可以直接看成1*100的,从1出发,要到达100,每次走的步数用一个大小为6的骰子决定.地图上有很多个通道 A可以直接到B,不过A和B大小不确定   而且 ...

  8. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

    正题 题目链接:https://www.luogu.com.cn/problem/P4457 题目大意 开始一个人最大生命值为\(n\),剩余\(hp\)点生命,然后每个时刻如果生命值没有满那么有\( ...

  9. ZJUT 1423 地下迷宫(期望DP&高斯消元)

    地下迷宫 Time Limit:1000MS  Memory Limit:32768K Description: 由于山体滑坡,DK被困在了地下蜘蛛王国迷宫.为了抢在DH之前来到TFT,DK必须尽快走 ...

随机推荐

  1. 迷茫的it男,我该何去何从

    从去年7月份毕业,一直到现在已经快一年了.准确的说,我已经是工作两年的人了.第一份工作是HIS工程人员,主要负责医院系统部署维护实施工作,当初之所以找实施,也是迫不得已,退而求其次的想法,当时还是在校 ...

  2. Linux内核原子(1) - spinlock的实现

    spinlock的数据结构spinlock_t定义在头文件linux/spinlock_types.h里面: typedef struct { raw_spinlock_t raw_lock; #if ...

  3. C++ 标准库string字符串的截取

    标准库的string有一个substr函数用来截取子字符串.一般使用时传入两个参数,第一个是开始的坐标(第一个字符是0),第二个是截取的长度. #include <iostream> #i ...

  4. ios基础篇(二十七)—— Json解析

    一.什么是Json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使 ...

  5. Windows Store App 全球化:运行时响应语言变更

    在应用程序运行过程中,系统的语言.像素.对比度等系统设置可能会发生改变,应用程序应根据系统环境的改变及时做出适当的响应.为了解决这样的问题,可以在应用程序中为系统状态更改事件注册事件处理方法,当语言. ...

  6. 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...

  7. UIImage

    //设置UIImage的圆角 + (UIImage *)imageNamed:(NSString *)name size:(CGSize)size cornerRadius:(CGFloat)corn ...

  8. 显示图片的(自定义)吐司Toast

    一般我们提示的时候都是直接提示文字的,其实Toast也可以显示图片 常用方法 Toast.makeText(context,text,duration)这返回一个Toast对象 toast.setDu ...

  9. js动态添加行

    <script> $(function() { //增加上传 var addli = function() { var linum = parseInt($(".pic-wrap ...

  10. Yii2 rules 添加时间比较功能

    php比较类文件:yiisoft\yii2\validators\CompareValidator.php JS比较类文件: yiisoft\yii2\assets\yii.validation.js ...