记录编号 386373 评测结果 AAAAAAAAAAAAAAAA
题目名称 [USACO Hol10] 臭气弹 最终得分 100
用户昵称 Gravatarxyz117 是否通过 通过
代码语言 C++ 运行时间 0.156 s
提交时间 2017-03-24 13:59:53 内存使用 1.05 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const string ss="dotp.";
int n,m,p,q;
int d[310];
double f[310][310],x[310],pro;
void swap(double &xx,double &yy)
{
    double t;
    t=xx;
    xx=yy;
    yy=t;
}
void gauss()
{
    double t;
    int im,num=1;
    for(int k=1;k<=n;k++,num++)
    {
        im=k;
        for(int i=k+1;i<=n;i++)
            if(fabs(f[i][k])>fabs(f[im][k]))
                im=i;
        if(im!=k)
            for(int i=k;i<=n+1;i++)
                swap(f[num][i],f[im][i]);    
        if(!f[num][k])
        {
            num--;
            continue;    
        }
        for(int i=num+1;i<=n;i++)
        {
            if(!f[num][k])
                continue;
            t=f[i][k]/f[num][k];
            for(int j=k;j<=n+1;j++)
                f[i][j]-=t*f[k][j]; 
        }   
    }
    num--;
    for(int i=n;i>=1;i--)      
    {
        for(int j=n;j>=i+1;j--)
            f[i][n+1]-=f[i][j]*x[j];
        x[i]=f[i][n+1]/f[i][i];    
    }  
}
int main()
{
    freopen((ss+"in").c_str(),"r",stdin);
    freopen((ss+"out").c_str(),"w",stdout);
    int a,b;
    scanf("%d%d%d%d",&n,&m,&p,&q);
    if(p>q)
        p=q;
    pro=(double)p/q;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        d[a]++;
        d[b]++;
        f[a][b]+=1.0;
        f[b][a]+=1.0;    
    }    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(d[j])
                f[i][j]/=d[j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            f[i][j]*=pro-1;
    for(int i=1;i<=n;i++)
        f[i][i]+=1.0;
    f[1][n+1]=pro;
    gauss();
    for(int i=1;i<=n;i++)
        printf("%.9lf\n",x[i]);
}