思路和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
",ans[i]);
}