BZOJ 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 ——期望DP

思路和BZOJ 博物馆很像。

同样是高斯消元

#include <map>
#include <ctime>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define maxn 100005
#define eps 1e-9 
 
double a[350][350];
double ans[350]; 
int n,m,p,q;
int h[maxn],to[maxn],ne[maxn],en=0,du[maxn];
 
void add(int a,int b)
{to[en]=b;ne[en]=h[a];h[a]=en++;du[a]++;}
 
void Gauss()
{
    F(i,1,n)
    {
        int tmp=i;
        F(j,i+1,n) if (fabs(a[tmp][i])<fabs(a[j][i])) tmp=j;
        if (tmp!=i) F(j,i,n+1) swap(a[tmp][j],a[i][j]);
        F(j,i+1,n) if (j!=i)
        {
            double t=a[j][i]/a[i][i];
            F(k,i,n+1) a[j][k]-=t*a[i][k];
        }
    }
    D(i,n,1)
    {
        F(j,i+1,n)
            a[i][n+1]-=a[i][j]*ans[j];
        ans[i]=a[i][n+1]/a[i][i];
    }
}
 
int main()
{
    scanf("%d%d%d%d",&n,&m,&p,&q);
    a[1][n+1]=1.0*p/q;
    F(i,1,m)
    {
        int x,y;scanf("%d%d",&x,&y);
        du[x]++;du[y]++;
        a[x][y]+=1.0; a[y][x]+=1.0;
    }
    F(i,1,n) F(j,1,n) if (du[j]) a[i][j]/=(double)du[j];
    F(i,1,n) F(j,1,n) a[i][j]*=1.0*p/q-1;
    F(i,1,n) a[i][i]+=1;
    Gauss();
    F(i,1,n) printf("%.9f\n",ans[i]);
}

  

posted @ 2017-04-05 18:01  SfailSth  阅读(155)  评论(0编辑  收藏  举报