BZOJ3270: 博物馆

来源:互联网 发布:软件测试公司 编辑:程序博客网 时间:2024/06/09 21:00

类似之前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;}
0 0
原创粉丝点击