BZOJ3270: 博物館

類似之前usaco的那道題。。
可能簡單一點 少幾個變量。。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;

char c;
inline void read(int&a)
{a=0;do c=getchar();while(c<'0'||c>'9');
while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();}

int n,m,a,b;
#define no(x,y) ((x)*n+(y)-n)

struct Chain
{
    int u;
    Chain*next;
}*Head[201];

inline void Add(int u,int v)
{
    Chain*tp=new Chain;
    tp->next=Head[u];Head[u]=tp;tp->u=v;
}

double T[501][501];
double I[501][501];
double A[501][501];
const
    double eps=1e-8;
void Gauss()
{
    int n=::n;
    n=n*n;
    for(int i=1;i<=n;i++)
    {
        int j=-1;
        for(int k=i;k<=n;k++)
            if(abs(T[k][i])>eps)
            {j=k;break;}
        for(int k=1;k<=n;k++)
            swap(T[j][k],T[i][k]),swap(I[j][k],I[i][k]);
        for(int k=1;k<=n;k++)
            if(i!=k)T[i][k]/=T[i][i],I[i][k]/=T[i][i];
        I[i][i]/=T[i][i];
        T[i][i]/=T[i][i];
        for(int j=i+1;j<=n;j++)
            {
                double e=T[j][i];
                for(int k=1;k<=n;k++)
                    T[j][k]-=T[i][k]*e,
                    I[j][k]-=I[i][k]*e;
            }
    }
    for(int i=n;i;i--)
    {
        for(int j=i-1;j;j--)
            {
                for(int k=1;k<=n;k++)
                    I[j][k]-=T[j][i]*I[i][k];
                T[j][i]-=T[j][i]*T[i][i];
            }   
    }

}

double F[501];
int d[501];


int main()
{
    read(n),read(m),read(a),read(b);
    while(m--)
    {
        int x,y;
        read(x),read(y);Add(x,y),Add(y,x);
        d[x]++;
        d[y]++;
    }
    for(int i=1;i<=n;i++)
        scanf("%lf",F+i);
    for(int i=1;i<=n;i++)
        for(int t=1;t<=n;t++)
            if(i!=t)
                for(Chain*tp=Head[i];tp;tp=tp->next)
                    T[no(i,t)][no(tp->u,t)]+=F[t]*(1-F[i])*1./d[i];

    for(int i=1;i<=n;i++)
        for(int t=1;t<=n;t++)
            if(i!=t)
                for(Chain*tp=Head[t];tp;tp=tp->next)
                    T[no(i,t)][no(i,tp->u)]+=F[i]*(1-F[t])*1./d[t];
    for(int i=1;i<=n;i++)
        for(int t=1;t<=n;t++)
            if(i!=t)
                T[no(i,t)][no(i,t)]+=F[t]*F[i];
    for(int i=1;i<=n;i++)
        for(int t=1;t<=n;t++)
            if(i!=t)
                for(Chain*tp=Head[i];tp;tp=tp->next)
                    for(Chain*tp2=Head[t];tp2;tp2=tp2->next)
                        T[no(i,t)][no(tp->u,tp2->u)]+=(1-F[t])*(1-F[i])*1./d[i]/d[t];

    for(int i=1;i<=n*n;i++)
        for(int t=1;t<=n*n;t++) 
            if(i==t)T[i][t]=1-T[i][t],I[i][t]=1;
            else T[i][t]=-T[i][t];
        Gauss();
    for(int i=1;i<=n;i++)
    {
        printf("%.6f ",I[no(a,b)][no(i,i)]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章