首先最难想的是两个人要在同一时间,同一地点相遇,这样很难处理,所以用类似于聪聪和可可的方法,用f[i][j]表示A在i位置,B在j位置,那么f[i][j]的转移方法就有四个
1、两个人都在原地没动,则a[f[i][j]]+=a[f[i][j]]*p[i]*p[j];
2(3)、其中有一个人动,以A动为例 a[f[i][j]]+=p[j]*((1-p[v]).chu[v])*a[f[v][j]];
4、两人都动,类比2即可.
注意到f是一个矩阵,所以将其编号,之后用高斯消元,接触每一个f[i][i]的值,就是答案;
1 #include<cmath> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 struct Node{ 9 int u,v,nxt; 10 }g[400]; 11 int n,m,A,B; 12 int chu[25]; 13 int adj[400],e; 14 int f[21][21]; 15 double p[25]; 16 double a[410][410]; 17 double ans[410]; 18 void add(int u,int v){ 19 g[++e].v=v; g[e].u=u; 20 g[e].nxt=adj[u]; adj[u]=e; 21 } 22 void gs(){ 23 int N=n*n+1; 24 int T=n*n; 25 int h=1,num; 26 for(int i=1;i<T;i++,h++){ 27 num=h; 28 for(int j=h+1;j<=T;j++){ 29 if(fabs(a[j][i]) > fabs(a[num][i])) num=j; 30 } 31 if(num!=h){ 32 for(int j=i;j<=N;j++){ 33 swap(a[h][j],a[num][j]); 34 } 35 } 36 if(a[h][i]==0){ 37 h--; 38 continue; 39 } 40 double ti; 41 for(int j=h+1;j<=T;j++){ 42 if(a[j][i]==0) continue; 43 ti=a[j][i]/a[h][i]; 44 for(int k=i;k<=N;k++){ 45 a[j][k]-=a[h][k]*ti; 46 } 47 } 48 } 49 for(int i=T;i>=1;i--){ 50 for(int j=i+1;j<=T;j++){ 51 a[i][N]-=a[i][j]*ans[j]; 52 } 53 ans[i]=a[i][N]/a[i][i]; 54 } 55 56 } 57 int main(){ 58 freopen("a.in","r",stdin); 59 scanf("%d%d%d%d",&n,&m,&A,&B); 60 int x,y; 61 for(int i=1;i<=m;i++){ 62 scanf("%d%d",&x,&y); 63 add(x,y); add(y,x); 64 chu[x]++; chu[y]++; 65 } 66 for(int i=1;i<=n;i++){ 67 add(i,i); 68 scanf("%lf",&p[i]); 69 } 70 memset(a,0,sizeof(a)); 71 int v1,v2; 72 int R; 73 a[(A-1)*n+B][n*n+1]=-1; 74 for(int i=1;i<=n;i++){ 75 for(int j=1;j<=n;j++){ 76 R=(i-1)*n+j; 77 a[R][R]=-1; 78 for(int k=adj[i];k;k=g[k].nxt){ 79 v1=g[k].v; 80 for(int h=adj[j];h;h=g[h].nxt){ 81 v2=g[h].v; 82 if(v1==v2) continue; 83 if(v1==i && v2==j){ 84 a[R][(i-1)*n+j]+=p[i]*p[j]; 85 } 86 else if(v1==i && v2!=j){ 87 a[R][(v1-1)*n+v2]+=p[v1]*((1-p[v2])); 88 } 89 else if(v1!=i && v2==j){ 90 a[R][(v1-1)*n+v2]+=p[v2]*((1-p[v1])); 91 } 92 else if(v1!=i && v2!=j){ 93 a[R][(v1-1)*n+v2]+=((1-p[v1]))*((1-p[v2])); 94 } 95 } 96 } 97 } 98 } 99 gs(); 100 for(int i=1;i<=n;i++){ 101 R=(i-1)*n+i; 102 // cout<<"R== "<<" "<<R<<endl; 103 printf("%.6lf ",ans[R]); 104 } 105 return 0; 106 }
时间: 2024-11-23 23:57:09