類似之前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;
}