zoukankan      html  css  js  c++  java
  • [CSP-S模拟测试]:糊涂图(概率DP)

    题目传送门(内部题76)


    输入格式

      第一行输入三个空格隔开的整数$n,m,s$表示随机加一条边之前的糊涂图的点数,边数,以及起点的编号。
      接下来$m$行,每行两个空格隔开的整数$a,b$表示从$a$到$b$有一条有向边。保证$a<b$,但可能存在重复的边。
      最后两个空格隔开的数字$Max,Avr$。如果$Max!=-1$,那么$Max$就是第一个问题的答案(三位小数),选手在输出的时候把$Max$直接输出就可以了。否则,如果$Max=-1$,说明没有给出第一个问题的答案,选手需要自己计算。$Avr$的作用相同,在$Avr!=-1$的时候给出第二个问题的答案(三位小数)。不会出现$Max$和$Avr$都不为$-1$的情况。


    输出格式

      一行两个空格隔开的小数(保留三位),表示$liu ext{_}runda$的最大获胜概率和平均获胜概率。


    样例

    见下发文件


    数据范围与提示

      对全部的测试点,$nleqslant 10^5,mleqslant 3 imes 10^5$,$Max$和$Avr$不会同时不等于$-1$
      第$1$个测试点,$m=0,Avr!=-1,Max=-1$
      第$2$个测试点,$m=0,Avr=-1,Max=-1$
      第$3,4$个测试点,$m=1,Avr=-1,Max=-1$
      第$5,6,7,8$个测试点,$nleqslant 100,mleqslant 300,Avr=-1,Max=-1$
      第$9,10,11$个测试点,$Avr!=-1,Max=-1$,也就是说需要自己求$Max$
      第$12,13,14$个测试点,$Max!=-1,Avr=-1$,也就是说需要自己求$Avr$
      第$15,16,17,18,19,20$个测试点,$Avr=-1,Max=-1$
      其中还有一些测试点具有较特殊的性质:
      第$5,15,16$个测试点还满足,$m=n-1$且对任意满足$2leqslant ileqslant n$的$i$,存在一条从$i-1$到$i$的有向边,也就是说图的形状是一条链
      第$9,12,17$个测试点还满足,$mleqslant 100$


    题解

    显然是一道树上概率$DP$,然后就不会了……

    可以知道,如果到不能走走了奇数条边,那么$liu ext{_}runda$获胜;否则失败。

    不妨做如下定义:

      $alpha.f[i]$表示从$i$号点出发经过奇数条边之后停止的概率。

      $eta,g[i]$表示在原来的图中从$s$出发经过$i$的概率。

      $gamma.h[i]$表示从$s$出发随机行走没有经过$i$的概率。

      $delta.p0[i]$表示从$s$出发经过$i$且经过偶数条边的概率。

      $epsilon.p1[i]$表示从$s$出发经过$i$且经过奇数条边的概率。

      $zeta.Q[i]$表示$liu ext{_}runda$从$i$出发获胜的概率。

    考虑求出$f$数组。

    对于$f[i]$,没有出度的点$f[x]=0$,直接递推求出其它点即可。

    考虑加边之后对胜率的影响,不妨设这条边从$u$到$v$,则原来走的时候可能根本不会经过$u$,那么对于这种情况,其对答案没有影响。

    考虑求出$g$数组。

    起点固定为$s$,可以对于每个点递推$x$求出在原来的图上从$s$出发经过点$i$的概率概率,$g[s]=1$。

    考虑求出$p0[i]$和$p1[i]$,$p0[s]=1,p1[s]=0$,递推其可得到其它值。

    考虑求出$h$数组。

    现在再考虑有加边的情况,可以再将其细分为两种情况:

      $alpha.$从$s$出发随机行走经过了$i$。

      $eta.$从$s$出发随机行走没有经过$i$。

    那么我们可以知道:

    $$f[s]=p0[i] imes f[i]+p1[i] imes (1-f[i])+(1-p0[i]-p1[i]) imes h[i]$$

    加边之后对胜率的影响只影响了从$u$出发的概率,也就是只影响了$p0[u] imes f[u]+p1[u] imes (1-f[u])$。

    再来考虑加边的影响,假设点$u$原来的出度为$k$,那么现在从$u$出发走这条加边的概率就是$frac{1}{k+1}$。

    因为这条加边在走过之后就会被删除,也就是恢复了原图的状态。

    那么如果$liu ext{_}runda$从$u$出发,那么其胜率即为:

    $$frac{1}{k+1} imes (1-f[v])+frac{k}{k+1} imes f[v]$$

    反之同理。

    所以答案就是

    $$ans=p0[i] imes Q[i]+p1[i] imes (1-Q[i])+(1-p0[i]-p1[i]) imes h[i]$$

    式中$Q[i]$在上面已经求出,即为

    $$Q[i]=frac{1}{k+1} imes (1-f[i])+frac{k}{k+1} imes f[i]$$

    而$(1-p0[i]-p1[i]) imes h[i]$则可以根据之前的$f[s]=p0[i] imes f[i]+p1[i] imes (1-f[i])(1-p0[i]-p1[i]) imes h[i]$求出。

    剩下的就是化简式子了,在此不再赘述。

    时间复杂度:$Theta(n+m)$。

    期望得分:$100$分。

    实际得分:$100$分。


    代码时刻

    #include<bits/stdc++.h>
    using namespace std;
    struct rec{int nxt,to;}e[300001];
    int head[100001],cnt;
    int n,m,s;
    double MA,AV;
    double f[100001],p[2][100001],h[100001],du[100001],sum,maxn,minn=1000000000.0;
    void add(int x,int y)
    {
    	e[++cnt].nxt=head[x];
    	e[cnt].to=y;
    	head[x]=cnt;
    }
    int main()
    {
    	scanf("%d%d%d",&n,&m,&s);
    	for(int i=1;i<=m;i++)
    	{
    		int u,v;
    		scanf("%d%d",&u,&v);
    		add(u,v);du[u]++;
    	}
    	p[0][s]=1;
    	for(int x=1;x<=n;x++)
    		for(int i=head[x];i;i=e[i].nxt)
    		{
    			p[0][e[i].to]+=p[1][x]/du[x];
    			p[1][e[i].to]+=p[0][x]/du[x];
    		}
    	for(int x=n;x;x--)
    		for(int i=head[x];i;i=e[i].nxt)
    			f[x]+=(1-f[e[i].to])/du[x];
    	for(int x=1;x<=n;x++)
    	{
    		maxn=max(f[x],maxn);
    		minn=min(f[x],minn);
    		sum+=1-f[x];
    		h[x]=f[s]-p[0][x]*f[x]-p[1][x]*(1-f[x]);
    	}
    	for(int i=1;i<=n;i++)
    	{
    		AV+=(p[1][i]+h[i])*(n-1)+(p[0][i]-p[1][i])*f[i]*du[i]*(n-1)/(du[i]+1)+(p[0][i]-p[1][i])*(sum+f[i]-1)/(du[i]+1);
    		double Q=(p[1][i]<p[0][i])?(1-minn)/(du[i]+1)+f[i]*du[i]/(du[i]+1):(1-maxn)/(du[i]+1)+f[i]*du[i]/(du[i]+1);
    		Q=p[0][i]*Q+p[1][i]*(1-Q)+h[i];
    		MA=max(MA,Q);
    	}
    	AV/=(double)n*(n-1);
    	printf("%.3lf %.3lf",MA,AV);
    	return 0;
    }
    

    rp++

  • 相关阅读:
    Pandas to_sql将DataFrame保存的数据库中
    Pandas 的groupby操作
    Hibernate(一)
    EasyUI
    Java面试题
    Solr
    Lucene
    SpringMVC(二)
    MyBatis(二)
    MyBatis(一)
  • 原文地址:https://www.cnblogs.com/wzc521/p/11717570.html
Copyright © 2011-2022 走看看