[Luogu P2973&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>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,m,d[303],head[303],cnt=0;
double a[303][303],f[303],p,q;
struct Node
{
    int next,to;
}Edges[100005];
void addedge(int u,int v)
{
    Edges[++cnt].next=head[u];
    head[u]=cnt;
    Edges[cnt].to=v;
}
void Gauss()
{
    for(int i=1;i<=n;i++)
    {
        int maxline=i;
        for(int j=i;j<=n;j++)
        if(a[j][i]>a[maxline][i])maxline=j;
        if(maxline!=i)
        for(int j=i;j<=n+1;j++)
        swap(a[maxline][j],a[i][j]);
        for(int j=i+1;j<=n;j++)
        {
            double t=a[j][i]/a[i][i];
            for(int k=i;k<=n+1;k++)
            a[j][k]-=t*a[i][k];
        }
    }
    for(int i=n;i>0;i--)
    {
        for(int j=n;j>i;j--)
        a[i][n+1]-=f[j]*a[i][j];
        f[i]=a[i][n+1]/a[i][i];
    }
}
int main()
{
    memset(head,-1,sizeof(head));
    scanf("%d%d%lf%lf",&n,&m,&p,&q);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        addedge(u,v);
        addedge(v,u);
        d[u]++,d[v]++;
    }
    for(int i=1;i<=n;i++)
    {
        a[i][i]+=1;
        for(int j=head[i];~j;j=Edges[j].next)
        {
            int v=Edges[j].to;
            a[v][i]-=(1-p/q)/d[i];
        }
    }
    a[1][n+1]+=1-p/q;
    Gauss();
    double sum=0;
    for(int i=1;i<=n;i++)sum+=f[i];
    for(int i=1;i<=n;i++)
    printf("%.9lf\n",f[i]/sum);
    return 0;
} 
时间: 2024-10-12 20:37:42

[Luogu P2973&BZOJ 1778][USACO10HOL]赶小猪DOtP(高斯消元+期望)的相关文章

[BZOJ 3143][Hnoi2013]游走(高斯消元+期望)

Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. Solution 对于点u(u≠1):到达u的概率 f[u]=∑f[v]/d[v] (Edges(u,v)) 而f[1]=∑f[v]/d[v]+1

BZOJ 3143 HNOI2013 游走 高斯消元 期望

这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. 输出最小的总分期望值. Solution: 这题贪心很明显

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关 每一位记录pivot[i]为i用到的行 枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出 如果最后异或成0了就说明线性相关... #include <iostream> #include &l

BZOJ 3503 CQOI 2014 和谐矩阵 高斯消元

题目大意:给出m和n,求出一种方案使得每一个点和周围的四个点的1的个数为偶数. 思路:根据题意可以列出m*n个异或方程,然后组成异或方程组.解这个异或方程组然后输出任意一个解就可以了. PS:值得注意的是,全是0肯定是一个解,显然你不能输出这个解.所以你需要让一个或一些自由元的值为1,至于怎么做,随便yy就行了. PS2:这个题的样例吞掉了空格,然而又是SPJ,所以就是wa..然后我wa了一下午.. CODE: #include <cstdio> #include <cstring>

BZOJ 2466: [中山市选2009]树( 高斯消元 )

高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int ma

BZOJ 1770: [Usaco2009 Nov]lights 燈( 高斯消元 )

高斯消元解xor方程组...暴搜自由元+最优性剪枝 ----------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int maxn = 49; int N, Id[max

BZOJ 1770: [Usaco2009 Nov]lights 燈 [高斯消元XOR 搜索]

题意: 经典灯问题,求最少次数 本题数据不水,必须要暴搜自由元的取值啦 想了好久 然而我看到网上的程序都没有用记录now的做法,那样做遇到自由元应该可能会丢解吧...? 我的做法是把自由元保存下来,枚举的时候只枚举自由元 但这样没法最优性剪枝了 于是枚举的时候还是从n到1枚举,到i时如果i是主元这时候i的值已经可以算出来了,这样就可以最优性剪枝了 但注意主元i你不能用i这个方程,而要保存pivot[i]为i用了哪个方程 然后一个伪贪心策略是自由元先搜0 #include <iostream>

BZOJ 2466 中山市选2009 树 高斯消元+暴力

题目大意:树上拉灯游戏 高斯消元解异或方程组,对于全部的自由元暴力2^n枚举状态,代入计算 这做法真是一点也不优雅... #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 110 using namespace std; int n,m; int f[M][M],is_free[M],tot; int ans[M],cnt; void

BZOJ 3569 DZY Loves Chinese II 高斯消元

题目大意:给定一个[魞歄连通图],多次询问当图中某k条边消失时这个图是否联通 强制在线 我们找到这个图的任意一棵生成树 然后对于每条非树边将其的权值赋为一个随机数 对于每条树边 我们将这条树边的权值设为所有覆盖这条树边的边权的异或和 那么图不连通当且仅当删除一条树边和覆盖这条树边的所有边集 而由于刚才的处理一条树边和覆盖这条边的所有边集的异或和为零 于是问题转化成了对于给定的k条边是否存在一个边权的异或和为零的子集 果断高斯消元 由于使用了随机化所以碰撞率极低 好方法学习了...构思真是巧妙 记