【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡

【题意】给定无向图,炸弹开始在1,在每个点爆炸概率p/q,不爆炸则等概率往邻点走,求在每个点爆炸的概率。

【算法】数学概率期望+高斯消元

【题解】令f[i]表示炸弹到达i点的概率(之前不爆炸)。

f[i]=∑f[j]*(1-Q)/d[j]

特别的,f[1]=∑f[j]*(1-Q)/d[j]+1(一开始就到达)。

只要一个点到就是到达,故使用概率加法。

使用高斯消元求解方程组,最后ansi=f[i]*Q

另一种思路,由于炸弹最终爆炸概率为1,所以sum=∑f[i],ansi=f[i]/sum

此题还有另一种解法,计算每个点到达次数的期望,到达概率和到达次数正相关(注意方程步数+1)。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=310,maxm=50010;
struct edge{int v,from;}e[maxm*2];
int first[maxn],tot,d[maxn],n,m,p,q;
double f[maxn][maxn];

void insert(int u,int v){tot++;e[tot].v=v;e[tot].from=first[u];first[u]=tot;d[v]++;}
void gauss(){
    for(int i=1;i<=n;i++){
        int t=i;
        for(int j=i+1;j<=n;j++)if(f[j][i]>f[t][i])t=j;
        if(t!=i)for(int j=i+1;j<=n;j++)swap(f[i][j],f[t][j]);
        for(int j=i+1;j<=n;j++)
            for(int k=n+1;k>=i;k--)
                f[j][k]-=f[j][i]/f[i][i]*f[i][k];
    }
    for(int i=n;i>=1;i--){
        for(int j=i+1;j<=n;j++)f[i][n+1]-=f[i][j]*f[j][n+1];
        f[i][n+1]/=f[i][i];
    }
}
int main(){
    scanf("%d%d%d%d",&n,&m,&p,&q);double Q=1.0*p/q;
    int u,v;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        insert(u,v);insert(v,u);
    }
    f[1][n+1]=1;
    for(int k=1;k<=n;k++){
        f[k][k]=1;
        for(int i=first[k];i;i=e[i].from)f[k][e[i].v]=-(1-Q)/d[e[i].v];
    }
    gauss();
    for(int i=1;i<=n;i++)printf("%.9lf\n",f[i][n+1]*Q);
    return 0;
}

时间: 2024-10-12 21:01:27

【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡的相关文章

BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡

1778: [Usaco2010 Hol]Dotp 驱逐猪猡 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 563  Solved: 216[Submit][Status][Discuss] Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<

BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元

题目大意:给定一个无向图,炸弹从1号节点出发,每个时刻有P/Q的概率爆炸,如果某个时刻没有爆炸,就会等概率沿着随机一条出边走到下一个城市,求最终每个城市的爆炸概率 #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 330 using namespace std; int n,m,p,q;

【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接.保证城市1至少连接一个其它的城市.一开始臭气弹会被放在城市1.每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <

BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接.保证城市1至少连接一个其它的城市.一开始臭气弹会被放在城市1.每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <

BZOJ1778 [Usaco2010 Hol]Dotp 驱逐猪猡

首先我们列出转移矩阵$M$,$M_{i, j} = \frac {1 - \frac{p} {q}} {deg[i]}$(i,j之间有边)or $M_{i, j} = 0$(i,j之间没边) 则这个矩阵$M_{i, j}$表示的是站在某个点$i$,下一次走到$j$且没有爆炸的概率 我们再看$M^n_{i, j}$,表示的站在某个点$i$,走$n$步以后到达$j$且没有爆炸的概率 故$M^n$的第一列代表了$1$号点到其他所有点的概率,设为列向量$A_n$,则$A_n = M^n * B$,其中$

●Joyoi Dotp 驱逐猪猡

题链: http://www.joyoi.cn/problem/tyvj-2610题解: 期望dp,高斯消元 对于每一种到达i点的方案,都存在一个概率p, 令dp[i]表示到达i点的期望次数,那么容易由期望的定义得出: dp[i]=p1*1+p2*1+p3*1+......(每个概率对应的权值都为1) 如果我们知道了每个点的期望的到达次数,那么在该点期望的爆炸次数=期望的到达次数*P/Q 就可以求出一个SUM=dp[1]+dp[2]+...+dp[N] 然后每个点的爆炸的概率就是(dp[i]*P

BZOJ_1778_[Usaco2010_Hol]_Dotp_驱逐猪猡_(期望动态规划+高斯消元+矩阵)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1778 炸弹从1出发,有\(\frac{P}{Q}\)的概率爆炸,如果不爆炸,等概率移动到连通的点.求在每个点爆炸的概率. 分析 我们构造一个\(n\)行\(n\)列的矩阵\(f\),其中\(f[i][j]\)表示从\(i\)移动到\(j\)的概率. 那么\(f^2\)中\(f^2[i][j]\)是\(f[i][k]\times{f[k][j]}\)得来的,也就是\(i\to{k}\to{j}

[Luogu P2973&amp;BZOJ 1778][USACO10HOL]赶小猪DOtP(高斯消元+期望)

Description 一个无向图,节点1有一个炸弹,在每个单位时间内,有可能在这个节点炸掉,也有p/q的概率随机选择一条出去的路到其他的节点上.问最终炸弹在每个节点上爆炸的概率. Solution 没错它就是BZOJ 1778…在bzoj上是权限题 炸弹最终爆炸的概率是1(可能是在无穷无尽的时间之后…),于是到达某一点的概率除以到达所有点的概率就是在这个节点上爆炸的概率 f[u]=∑f[v]*(1-p/q)/d[v] #include<iostream> #include<cstdio

bzoj1776[Usaco2010 Hol]cowpol 奶牛政坛*

bzoj1776[Usaco2010 Hol]cowpol 奶牛政坛 题意: 给出一个树,每个节点k个政党中的一个.问每个政党间最远的两个节点距离多少.节点数≤200000. 题解: 有个结论:每个政党所求两个节点其中一个必然是这个政党中深度最大的节点.因此枚举每个节点,计算该节点与节点所属政党深度最大节点的距离(倍增法),与给政党的答案比较即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorit